如何实现GDB与Thread Sanitizer交互,在警告/错误触发时暂停?
GDB + Thread Sanitizer 报错自动暂停方案
方案一:修复TSAN环境变量参数
你之前用的halt_on_error=1只对严重错误生效,TSAN的普通警告(比如数据竞争提示)默认不会触发终止。要让所有报告(错误+警告)都触发暂停,得补充参数:
set env TSAN_OPTIONS=halt_on_error=1:report_signal=SIGTRAP
halt_on_error=1:强制TSAN在检测到问题时终止流程report_signal=SIGTRAP:让TSAN报告时发送SIGTRAP信号,GDB会自动捕获这个信号并暂停程序
设置完直接敲run,下次TSAN要输出任何问题报告时,程序会立刻停在GDB里。
方案二:精准断点替代冗长的__tsan::ReportRace
如果参数法不生效,换个更通用的断点:给TSAN的核心报告入口__tsan::Report设断点,这个函数是所有TSAN报告的统一入口,比__tsan::ReportRace范围更广,而且不用单步内部代码:
break __tsan::Report
每次TSAN要输出错误/警告时,都会触发这个断点,直接停在报告触发的起始位置,省去翻大量内部代码的麻烦。
方案三:确保环境变量生效的小技巧
有时候GDB里设置的环境变量没被程序继承,可以先在shell里设置好再启动GDB:
export TSAN_OPTIONS=halt_on_error=1:report_signal=SIGTRAP gdb ./你的程序名
然后在GDB里直接run,确保参数被正确加载。
内容的提问来源于stack exchange,提问作者Klaus
相关产品推荐
相关产品推荐

