输出对日志文件的函数调用 我有一些传统的C++代码,这些代码多年来一直没有维护。我现在正在努力学习它是如何工作的。它接受.xml输入,并输出一个文本文件。两个不同的.xml输入文件处理时间相差很大,其中一个运行正常,另一个运行不正常。但他们的开头是一样的。我想输出当我使用两个不同的输入执行代码时所做的函数调用的日志文件,并将这些日志相互区分,以查看它们开始发散的地方。我不能直接在main()的第一行中断代码,然后逐步遍历gdb中的控制流。时间太长了。理想情况下,我想找到一种方法来做类似的事情

输出对日志文件的函数调用 我有一些传统的C++代码,这些代码多年来一直没有维护。我现在正在努力学习它是如何工作的。它接受.xml输入,并输出一个文本文件。两个不同的.xml输入文件处理时间相差很大,其中一个运行正常,另一个运行不正常。但他们的开头是一样的。我想输出当我使用两个不同的输入执行代码时所做的函数调用的日志文件,并将这些日志相互区分,以查看它们开始发散的地方。我不能直接在main()的第一行中断代码,然后逐步遍历gdb中的控制流。时间太长了。理想情况下,我想找到一种方法来做类似的事情,c++,gdb,stack-trace,C++,Gdb,Stack Trace,gdb--args old_exec inp1.xml-step>log1.txt gdb--args old_exec inp2.xml-step>log2.txt diff log1.txt log2.txt “-step”标志当然不是真的,但也许有某种方法可以告诉它记录所有的步骤。有什么想法吗?谢谢 GCC编译器有一个标志,-finstrument functions,它使函数在进入和退出时调用特定函数;您可以使用它来跟踪代码流。使用此标志时,您需要提供以下功能: void __cyg_


gdb--args old_exec inp1.xml-step>log1.txt
gdb--args old_exec inp2.xml-step>log2.txt
diff log1.txt log2.txt


“-step”标志当然不是真的,但也许有某种方法可以告诉它记录所有的步骤。有什么想法吗?谢谢

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将指针转换为文件/函数/行号。通常最好在运行时记录原始指针,并执行事后地址转换


有关详细信息,请参阅。

非常感谢!我推测,如果您出于某种原因想要声明(或者定义)在使用-finstrument functions标志编译的源文件中输入和输出的函数,您可以使用属性no_instrument_function声明它们,这样您就不会通过否则会得到的无限递归溢出调用堆栈。是的,不检测这些调用的属性也应该起作用。但我确实忽略了一点——当你标记C++时,你需要声明这些代码>外部“C”< /COD>。另外--最好编译并链接
-g
,以充分利用符号分辨率。