Windows下GDB11.1/12.1无法为__cxa_throw设置断点的问题
GDB 11.1+无法为__cxa_throw设置断点(Qt5依赖C++项目)
环境
- Windows 10
- MinGW64 C++ 12.2.0 编译二进制程序
问题现象
在CLion捆绑的GDB 12.1、MinGW64官方的GDB 12.1/11.1中,无法为C++异常抛出函数__cxa_throw设置断点;但MinGW64 GDB 10.1可正常设置。启动GDB时还会出现swift_willThrow等函数未定义的提示。
核心表现
- 异常版本GDB中,执行
info functions __cxa_throw会返回两个实例:主程序二进制文件内的实例,以及Qt5Core.dll中的实例 - 直接执行
break __cxa_throw会提示「函数未定义」,断点无法创建 - GDB 10.1则会自动在两个实例位置都成功设置断点
复现条件
仅在依赖Qt5的C++项目中出现该问题,无Qt5依赖的项目表现正常,推测问题源于GDB新版本对多实例函数的处理逻辑变更。
临时解决方案
当存在多个__cxa_throw实例时,需要指定具体的实例路径或地址来设置断点:
- 先通过
info functions __cxa_throw获取两个实例的完整信息,示例输出:All functions matching regular expression "__cxa_throw": File c++abi.h: void __cxa_throw(void*, std::type_info*, void (*)(void*)); Non-debugging symbols: 0x00007ffdxxxxxx00 __cxa_throw in C:\path\to\your\app.exe 0x00007ffdxxxxxx00 __cxa_throw in C:\path\to\Qt5Core.dll - 针对具体实例设置断点:
- 通过内存地址设置:
break *0x00007ffdxxxxxx00 - 通过库文件指定:
break __cxa_throw in Qt5Core.dll
- 通过内存地址设置:
原因分析
GDB 11.x及以上版本对多符号实例的匹配逻辑做了调整,当同一个函数名存在于多个不同二进制文件内时,不再自动批量设置断点,也无法通过函数名直接匹配,必须指定具体实例或路径;而GDB 10.1会自动处理多实例场景,直接为所有匹配的函数设置断点。
内容的提问来源于stack exchange,提问作者Versum
相关产品推荐
相关产品推荐

