我有一些多年未维护的遗留C ++代码。我正试图了解它目前是如何运作的。它需要.xml输入,并应吐出输出文本文件。两个不同的.xml输入文件需要花费大量不同的时间来处理,其中一个行为正常,另一个则没有。他们虽然开始相同。我想输出当我用两个不同的输入执行代码时所做的函数调用的日志文件,并将这些日志相互区分,以查看它们开始发散的位置。我不能直接在main()的第一行中断代码,并逐步通过gdb中的控制流。它花了太长时间。理想情况下,我想找到一种方法来做类似
的事情
gdb --args old_exec inp1.xml -step >log1.txt
gdb --args old_exec inp2.xml -step >log2.txt
diff log1.txt log2.txt
“-step”标志当然不是真的,但也许某种方式告诉它记录所有步骤确实存在。有什么想法吗?谢谢!
答案 0 :(得分:3)
GCC编译器有一个标志-finstrument-functions
,它使你的函数在进入和退出时调用特定的函数;您可以使用它来跟踪您的代码流。使用此标志后,您需要提供以下功能:
void __cyg_profile_func_enter (void *this_fn, void *call_site);
void __cyg_profile_func_exit (void *this_fn, void *call_site);
并记住,在编译这些函数时,不能使用intrumentation标志对它们进行编译!
您可以使用addr2line将指针转换为文件/函数/行号。通常在运行时记录原始指针并执行事后地址转换会更好。
有关详细信息,请参阅http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/。