我想看看我的用户空间C99程序中调用了哪些函数以及按什么顺序调用。此外,还给出了哪些参数。
我可以用dtrace吗?
E.g。对于程序
int g(int a, int b) { puts("I'm g"); }
int f(int a, int b) { g(5+a,b);g(8+b,a);}
int main() {f(5,2);f(5,3);}
我看到一个带有以下内容的文本文件:
main(1,{"./a.out"})
f(5,2);
g(10,2);
puts("I'm g");
g(10,5);
puts("I'm g");
f(5,3);
g(10,3);
puts("I'm g");
g(11,5);
puts("I'm g");
我不想修改我的源代码,程序真的很大 - 有9千个函数。
我有所有来源;我有一个程序,其中编译了调试信息,gdb能够在backtrace中打印函数参数。
任务是否可以用dtrace解决?
我的操作系统是BSD,Linux,MacOS,Solaris之一。我更喜欢Linux,但我可以使用任何列出的操作系统。
答案 0 :(得分:0)
是的,您可以使用dtrace执行此操作。但是你可能永远无法在linux上做到这一点。我已经尝试过dtrace的linux端口的多个版本,它从来没有做过我想要的。事实上,它曾经引起CPU恐慌。从http://www.brendangregg.com/dtrace.html下载dtrace工具包。然后相应地设置PATH。然后执行:
dtruss -a yourprogram args...
答案 1 :(得分:-2)
您的问题极有可能被误导。对于任何非平凡的程序,打印使用其参数执行的所有函数调用的序列将导致多MB甚至多GB输出,您将无法理解(对于人类来说太多细节)理解)。
那就是说,我不相信你能用dtrace
达到你想要的效果。
您可以从使用GCC -finstrument-functions
标志开始,这样可以轻松地在进入/退出每个功能时打印功能地址。然后,您可以使用addr2line将地址转换为函数名称。这样可以满足您的要求(参数除外)。
如果结果不太详细,可以在GDB中的每个函数上设置断点(使用rb .
命令),并将continue
命令附加到每个断点。这将导致稳定的断点流(带参数),但执行速度可能至少慢100到1000倍。