You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例时,需要指定具体的实例路径或地址来设置断点:

  1. 先通过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
    
  2. 针对具体实例设置断点:
    • 通过内存地址设置:
      break *0x00007ffdxxxxxx00
      
    • 通过库文件指定:
      break __cxa_throw in Qt5Core.dll
      

原因分析

GDB 11.x及以上版本对多符号实例的匹配逻辑做了调整,当同一个函数名存在于多个不同二进制文件内时,不再自动批量设置断点,也无法通过函数名直接匹配,必须指定具体实例或路径;而GDB 10.1会自动处理多实例场景,直接为所有匹配的函数设置断点。

内容的提问来源于stack exchange,提问作者Versum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:36:38