事情的起因是这样的,之前同事的代码有一个内存池出现了没有回收的情况。也就是是Pop出来的对象没有Push回去,情况很难复现,所以在Pop里的打印日志,跟踪是谁调用了它,我想在GDB调试里可以追踪调用的栈帧,那也一定有方法实现。首先上网搜索了一下,并没有结果!还好代码量不是很多,只能用最笨的方法,在每个调用Pop的地方,传参,把调用的文件,行号作为字符串传进去,在日志里打印!忙活完了,总感觉一定是有方法可以实现查看调用栈帧的,于是在QQ群里的问了下,果然有这方面经验的同学给出了答案!
主要是通过backtrace返回调用的栈帧,然后通过backtrace_symbols把地址转换为字符串。最后,在Linux下有个工具addr2line可以将地址转换为文件名和行号!通过管道调用addr2line,最后打印调用栈帧。
编译:
g++ -Wall -g backtrace.cpp -o bt
执行:
./bt
效果:
Obtained 5 stack frames.
0x400a8a print_trace() /home/ubuntu/project/Test/backtrace.cpp:58
0x400c47 dummp_function() /home/ubuntu/project/Test/backtrace.cpp:81
0x400c5d main /home/ubuntu/project/Test/backtrace.cpp:86
0x7f5ca6d8ef45 ?? ??:0
0x4007d9 _start ??:?
大致满足自己的需求效果,函数名称还需要修饰一下!