如何用GDB批量给函数foo的所有调用者设置断点?
批量给
foo的调用者设置GDB断点的方法 示例代码:
void caller1() {if(cond1())return;else foo();} void caller2() {foo();} void caller3() {foo();} void foo(void) {return;}
针对你不想逐个设置调用者断点、且无法直接在foo上断点的需求,以下是两种便捷的GDB命令方案:
方案1:批量在所有调用foo的代码位置设置断点
这个方法会精准定位到每个调用foo的指令行,确保只要执行到调用foo的逻辑就触发断点,适合caller1这种有条件调用的场景:
- 先执行GDB命令列出所有调用
foo的站点:
maint info callsites foo
执行后会输出类似内容:
Callsite at 0x400511 in function caller1: calls foo Callsite at 0x40051d in function caller2: calls foo Callsite at 0x400523 in function caller3: calls foo
- 接着用以下命令批量提取这些调用地址并设置断点:
maint info callsites foo | grep "Callsite at" | awk '{print $3}' | xargs -I {} break {}
执行后,每个调用foo的位置都会被设置断点,不管调用者名称是什么,都能批量完成。
方案2:批量给所有调用foo的函数入口设置断点
如果你希望只要进入调用foo的函数就触发断点(不管函数内是否最终执行到foo),可以基于maint info callsites的输出提取函数名,批量设置函数断点:
maint info callsites foo | grep "in function" | awk '{print $4}' | sort -u | xargs -I {} break {}
这里的sort -u是为了去重,避免同一个函数多次调用foo时重复设置断点。
内容的提问来源于stack exchange,提问作者mariolu
相关产品推荐
相关产品推荐

