如何使用GDB为函数的所有返回位置设置断点?
如何使用GDB为函数的所有返回位置设置断点?
嗨,这问题我太有发言权了!你完全不用手动给每个return语句挨个加断点,GDB早就帮我们准备了更高效的方法,一次性就能搞定函数的所有返回触发点,省超多时间!
我给你说两个最常用的靠谱办法:
方法一:用
catch return命令(首推,简单直接)
这是GDB专门用来监控函数返回的命令,如果只针对你关心的my_func,直接在GDB里输入:catch return my_func回车之后,GDB就会自动盯紧
my_func的所有返回动作——不管函数里有多少个分支的return语句,只要函数要返回了,断点就会立刻触发。这时候你就可以用print foo、print bar这些命令查看当时的变量值,或者用bt查看调用栈,轻松排查问题。要是你输入
catch return不带函数名,就会监控程序里所有函数的返回,不过一般不建议这么做,不然断点会频繁触发,调试起来反而麻烦。方法二:针对旧版GDB的替代方案
要是你的GDB版本比较老,不支持catch return命令,可以试试直接给函数的隐含返回位置设断点:break my_func.return这个命令会命中
my_func的所有返回点,效果和catch return差不多,就是兼容性更好,适合一些老环境。
举个实际调试的例子,就拿你给出的函数来说:
int my_func() { int foo = some_func(); if (foo > 128) { return 1; // 这里会触发断点 } int bar = other_func(); if (bar < 0) { return -1; // 这里也会触发断点 } return 0; // 这个返回点同样会被命中 }
当你输入catch return my_func后,不管程序走到哪一个return,GDB都会自动停下来,让你有足够的时间检查当时的程序状态。
内容来源于stack exchange
相关产品推荐
相关产品推荐

