dtrace:跟踪所有函数调用并打印出它们的参数(用户空间)

时间:2011-08-23 15:57:28

标签: debugging gdb tracing dtrace

我想看看我的用户空间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,但我可以使用任何列出的操作系统。

2 个答案:

答案 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倍。