附加运行进程时GDB的-break-commands命令失效求助
问题排查与解决
1. 确认断点条件是否可命中
- 先检查附加进程时变量
m的当前值,如果此时m已经大于等于10,那么条件断点m==10永远不会触发,自然看不到命令执行效果。可以在附加时执行-data-evaluate-expression m查看当前值,再调整断点条件(比如改为m>=10或匹配进程当前状态的条件)。
2. 修正断点命令的格式
GDB MI的-break-commands在shell转义时容易出错,建议改用更可靠的CLI模式commands命令替代:
将原命令中-break-commands对应的行,替换为以下CLI命令序列:
-ex "commands 1" -ex "silent" -ex "set var m=1001" -ex "set var i=100" -ex "cont" -ex "end"
这种方式无需复杂转义,直接通过CLI绑定断点命令,稳定性更高。
3. 验证断点配置与执行顺序
- 执行
-break-list后,查看输出中对应断点的commands字段,确认设置的命令序列已正确绑定。 - 确保
--batch模式下GDB会等待断点触发:-exec-continue在batch模式下会默认等待进程事件,直到断点命中或进程退出,无需额外添加等待命令。
修正后的完整GDB命令
gdb -p $(pidof ./test_condiction_breakpoint) --batch \ -ex "interpreter-exec mi '-break-insert -c \"m == 10\" -f test_condiction_breakpoint.cc:21'" \ -ex "interpreter-exec mi '-break-after 1 1'" \ -ex "commands 1" \ -ex "silent" \ -ex "set var m=1001" \ -ex "set var i=100" \ -ex "cont" \ -ex "end" \ -ex "interpreter-exec mi 'set follow-fork-mode parent'" \ -ex "interpreter-exec mi '-break-list'" \ -ex "interpreter-exec mi '-exec-continue'"
手动验证步骤
可以先手动附加进程排查问题:
gdb -p $(pidof ./test_condiction_breakpoint)
然后在GDB交互模式下输入以下命令:
break test_condiction_breakpoint.cc:21 if m == 10 commands 1 silent set var m=1001 set var i=100 cont end continue
如果手动操作能正常触发断点并执行命令,说明原问题是MI命令的shell转义导致的。
内容的提问来源于stack exchange,提问作者Geng
相关产品推荐
相关产品推荐

