15

我是新手,所以可能缺少一些基本的东西。我使用 gcc 4.8 (MinGW) 和 -g 选项编译我的 C 程序。

然后我运行它并用非常困倦的方式捕获它。一切正常,但 Sleepy 的输出如下所示:

memcpy             0.98 0.98 7.65 7.65  msvcrt unknown 0
[00000000004038FE] 0.77 0.77 6.02 6.02  a              0
memset             0.63 0.63 4.92 4.93  msvcrt unknown 0
[0000000000404549] 0.42 0.42 3.29 3.29  a              0
[000000000040282A] 0.35 0.35 2.73 2.73  a              0
[0000000000404600] 0.25 0.25 1.99 1.99  a              0
....
etc.

(我的应用程序称为 a.exe)
所以 Sleepy 看不到函数名称,我需要如何编译/运行才能使其工作?昏昏欲睡的网站给出:

支持 GCC/mingw。您现在可以使用嵌入式 DWARF2 数据分析可执行文件,它应该可以工作。这不需要特殊选项,只需使用“-g”编译以确保您有符号存在。您可能还希望使用“-fno-omit-frame-pointer”来确保正确的调用堆栈,尽管 Sleepy 通常会以任何一种方式工作。您不需要使用“-pg”或任何垃圾。它甚至可以将 Microsoft DLL 之间的正确堆栈传送到 GCC 中,这比您想象的要难。

但就我而言,这还不够。

4

1 回答 1

7

通常我们用参数调用非常昏昏欲睡的命令(或任何其他调试工具):

  • -O0: 设置默认代码优化(更优化的代码用来减少时间或空间可以隐藏一些功能)
  • -g:它用于保留函数和变量的名称,默认情况下为了优化可执行文件而被修改,但它使它的可调试性降低:gcc -g:会发生什么
  • -fno-omit-frame-pointer:它还用于通过省略帧指针来改进调试(用于提高性能但使调试的可读性降低的功能),根据我何时应该省略帧指针?. 使用该选项,输出汇编代码更简单。这有助于调试器
  • -gdwarf-2https : //gcc.gnu.org/onlinedocs/gcc-3.4.5/gcc/Debugging-Options.html 指定它设置为强制输出调试格式为“dwarf2”。事实上,-g 选项只是告诉编译器“保留一些信息”。gdwarf 将指定输出格式(如果可能)。

您还可以添加一个-glevel来表示输出信息的精度。默认一个是2。它不保留宏和一些定义。也许您可以将其设置为 3。

如果这还不够,也许您可​​以提供一个最小的工作样本来查看确切的问题(哪个函数应该出现在日志中)?

我希望它会有所帮助

于 2016-06-23T20:23:53.967 回答