2012-08-28 54 views
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

的“ - 工序”标志是不是真实的,当然,但也许某种方式来告诉它来记录所有步骤做存在。有什么想法吗?谢谢!

回答

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/了解更多详情。

+0

非常感谢!我收集到,如果出于某种原因想要声明(也可能定义)函数在使用-finstrument-functions标志编译的源文件中输入和退出,则可以使用属性no_instrument_function声明它们,以免溢出调用通过你会得到的无限递归堆栈。 – josh

+0

是的,不处理这些调用的属性应该也能正常工作。有一件事我没有留意 - 看到你标记了C++,你需要声明这些'extern“C”'。另外 - 最好如果你编译并使用'-g'链接,以充分利用符号解析。 – mah