使用gdb的catch throw时如何仅捕获指定线程抛出的异常?
解决方案
首先明确:原生catch throw命令没有提供直接指定线程的参数,但可以通过给catchpoint添加线程判定条件的方式精准实现需求,不需要依赖异常类型的间接匹配。
方案1:分步设置带条件的异常捕获点
- 第一步:运行
info threads,找到你需要监听的工作线程对应的gdb内部编号(命令输出第一列的数字,不是系统层面的TID),假设目标线程编号为2 - 第二步:设置全局异常捕获点:
catch throw,执行后gdb会返回该捕获点的编号,例如返回Catchpoint 1 (throw)即代表捕获点编号为1 - 第三步:给捕获点添加线程过滤条件:
condition 1 $_thread == 2,其中$_thread是gdb内置变量,存储当前触发断点的线程编号
完成后只有编号为2的线程抛出异常时,gdb才会暂停,其他线程抛出的异常会被直接忽略。
方案2:单命令直接设置(适配gdb 7.0及以上版本)
如果已经提前拿到目标线程编号,可以直接执行一行命令完成设置:
catch throw if $_thread == 2
注意事项
- 部分gdb 7.0之前的旧版本内置线程变量名为
$thread,如果条件不生效可以替换变量名测试 - 如果调试时目标线程还未创建,可以先在线程创建的逻辑处打断点,等线程创建完成、拿到对应编号后再设置异常捕获条件
内容的提问来源于stack exchange,提问作者jma
相关产品推荐
相关产品推荐

