2

我有一些多年未维护的遗留 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”标志不是真实的,但也许有某种方式告诉它记录所有步骤确实存在。有什么想法吗?谢谢!

4

1 回答 1

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/

于 2012-08-28T15:40:35.757 回答