Windows10环境下GDB执行info registers后自动终止问题
问题根因
该问题是Windows平台GDB的已知缺陷,主要出现在MinGW/MinGW-w64分发的旧版本GDB中:当执行info registers全量读取寄存器时,GDB会尝试读取AVX-512、系统特权寄存器等Windows用户态调试接口未开放访问权限的寄存器,旧版本GDB未对读取失败的异常做容错处理,会直接触发自身崩溃退出。而指定单个寄存器查询时,不会触发对无权限寄存器的扫描,因此可以正常执行。
解决方案
- 升级GDB版本:优先使用MSYS2软件源中的最新
gdb包,或者MinGW-w64官方构建的最新版本GDB,新版本已针对该问题做了容错处理,读取失败的寄存器会自动跳过,不会触发崩溃。 - 临时规避全量查询:如果暂时无法升级GDB,可通过指定所有需要的通用寄存器名称的方式批量查询,例如32位程序执行:
64位程序对应替换为rax、rbx等64位寄存器名即可。info registers eax ebx ecx edx esi edi ebp eip eflags esp - 自定义编译GDB:如果是自行编译GDB使用,可在编译配置阶段添加
--disable-avx512参数,关闭对AVX-512寄存器的读取逻辑,即可避免触发权限问题。 - 排查目标程序:确认你调试的exe未添加反调试、加壳逻辑,部分带防护的程序会主动触发异常导致调试器崩溃,可使用未加壳的简单测试程序复现验证是否属于GDB本身的问题。
内容的提问来源于stack exchange,提问作者User9728
相关产品推荐
相关产品推荐

