C 如何跟踪所有本地函数调用和退出,并将其记录到文件中以供查看
我想在Linux下跟踪一个C程序,并以树的形式记录所有函数调用和返回。 例如,源代码:C 如何跟踪所有本地函数调用和退出,并将其记录到文件中以供查看,c,linux,debugging,call,trace,C,Linux,Debugging,Call,Trace,我想在Linux下跟踪一个C程序,并以树的形式记录所有函数调用和返回。 例如,源代码: void a () { printf("a\n"); } void b () { printf("b\n"); } void c () { a(); b(); } int main() { a(); b(); c(); } 我想要一个如下的输出: call main call a exit a call b exit
void a ()
{
printf("a\n");
}
void b ()
{
printf("b\n");
}
void c ()
{
a();
b();
}
int main()
{
a();
b();
c();
}
我想要一个如下的输出:
call main
call a
exit a
call b
exit b
call c
call a
exit a
call b
exit b
exit c
exit main
这是一个理想主义的输出。我只想获得本地函数调用和返回的所有过程,因此也欢迎使用类似的输出。要通过修改代码来生成这样的输出,请尝试以下操作(未优化,但可以完成此工作):
大小缩进;
#定义输入函数(函数名称)\
缩进++\
对于(size_t i=0;igcc-finstruction函数完成我的工作很好地使用printf
跟踪函数的进入和退出(C++的构造函数/析构函数概念)。若要在文件中打印,请使用fprintf
请检查此链接。这可能会有帮助。这是一个大项目,因此很难手动将fprintf语句注入所有函数。是否有任何工具可以帮助我?您可能会找到有用的ltrace。用于跟踪调用,但我不知道您是否可以跟踪出口。SystemTap有您需要的工具需要。唯一可能导致问题的是,您的项目太大,无法用SystemTap跟踪。我回答了差不多相同的问题后,非常感谢!这是一个大项目,因此很难手动将ENTER_FUNC语句插入所有函数。有没有工具可以帮我将ENTER_FUNC插入所有函数?例如,如果你了解Python,你可以编写一个脚本来完成这项工作。也可以(小心地)在Vim这样的编辑器中使用适当的搜索和替换命令来完成。例如:只要有return[where]
insertEXIT_FUNC
。还要注意的是,如果您有一个包含大量调用的大型程序,这些宏将严重影响您的性能。而且它们不受竞争调用(线程等)的保护
size_t indent;
#define ENTER_FUNC(function_name) \
indent++; \
for(size_t i=0; i<indent; i++) printf("\t"); \
printf("Call %s\n", function_name);
#define EXIT_FUNC(function_name) \
for(size_t i=0; i<indent; i++) printf("\t"); \
printf("Exit %s\n", function_name); \
indent--;