假设只希望收到有关特定功能的通知,可以这样进行:
使用调试信息进行编译(由于您已经具有符号信息,因此您可能还具有足够的调试功能)
给定
#include <iostream>int fac(int n) { if(n == 0) return 1; return n * fac(n-1);}int main(){ for(int i=0;i<4;i++) std::cout << fac(i) << std::endl;}
使用gdb跟踪:
[js@HOST2 cpp]$ g++ -g3 test.cpp[js@HOST2 cpp]$ gdb ./a.out(gdb) b facBreakpoint 1 at 0x804866a: file test.cpp, line 4.(gdb) commands 1Type commands for when breakpoint 1 is hit, one per line.End with a line saying just "end".>silent>bt 1>c>end(gdb) runStarting program: /home/js/cpp/a.out#0 fac (n=0) at test.cpp:41#0 fac (n=1) at test.cpp:4#0 fac (n=0) at test.cpp:41#0 fac (n=2) at test.cpp:4#0 fac (n=1) at test.cpp:4#0 fac (n=0) at test.cpp:42#0 fac (n=3) at test.cpp:4#0 fac (n=2) at test.cpp:4#0 fac (n=1) at test.cpp:4#0 fac (n=0) at test.cpp:46Program exited normally.(gdb)
这是我收集所有函数地址的方法:
tmp=$(mktemp)readelf -s ./a.out | gawk '{ if( == "FUNC" && != 0) { print "# pre for " $NF; print "b *0x" ; print "commands"; print "silent"; print "bt 1"; print "c"; print "end"; print ""; } }' > $tmp; gdb --command=$tmp ./a.out; rm -f $tmp
请注意,除了打印当前frame(
bt1)之外,您还可以执行任何 *** 作,打印某些全局值,执行一些shell命令,或者在命中该
fatal_bomb_exploded函数时发送邮件:)不幸的是,gcc输出了一些“当前语言已更改”消息之间。但这很容易被窃听。没什么大不了的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)