Windows 很困不';捕获MinGW编译文件时看不到函数名
我是新手,所以可能缺少一些基本的东西。 我用GCC4.8(MinGW)和-g选项编译我的C程序 然后,我运行它,并捕捉它非常困倦。这一切都正常,但Sleepy的输出如下所示:Windows 很困不';捕获MinGW编译文件时看不到函数名,windows,gcc,profiling,verysleepy,Windows,Gcc,Profiling,Verysleepy,我是新手,所以可能缺少一些基本的东西。 我用GCC4.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 u
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看不到函数名,我需要如何编译/运行它才能工作? Sleepy网站提供: 支持GCC/mingw。您现在可以使用嵌入的DWARF2数据分析可执行文件,它应该可以工作。这不需要特殊的选项,只需使用“-g”进行编译,以确保存在符号。您可能还希望使用“-fno ommit frame pointer”来确保正确的调用堆栈,尽管Sleepy通常会以任何方式工作。你不需要使用“-pg”或任何垃圾。它甚至可以将Microsoft DLL之间的正确堆栈转换为GCC DLL,这比您想象的要困难
但在我的例子中,这还不够。通常我们使用以下参数调用very sleepy命令(或任何其他调试工具):
:设置默认代码优化(用于减少时间或空间的优化代码可能会隐藏某些功能)-O0
:它用于保留默认情况下被破坏的函数和变量的名称,以优化可执行文件,但会降低可调试性:-g
:根据,它还通过使用帧指针(一种用于提高性能但使调试可读性降低的功能)来改进调试。使用该选项,输出汇编代码更加简单。这有助于调试器-fno省略帧指针
:指定将其设置为强制输出调试格式为“dwarf2”。事实上,-g选项只是告诉编译器“保留一些信息”。gdwarf将指定输出格式(如果可能)李>-gdwarf-2
-glevel
,以指示输出信息的精度。默认值为2。它不保留宏和一些定义。也许你可以把它设为3
如果这还不够,也许您可以提供一个最小的工作示例来查看确切的问题(哪个函数应该出现在日志中)
我希望它将有助于使用-gdwarf-2编译解决大部分问题;显然GCC4.8的默认版本是Drawer的更新版本,Sleepy无法阅读;仍然有一些无法识别的函数,但所有最昂贵的函数现在都已识别。我遇到了相同的问题,但无法解决它。我使用
-g-fno省略帧指针-gdwarf-2
或它们的任何组合,但与g++4.8.3
一起使用时未成功。我是否遗漏了一些明显的东西?我已经有一段时间没有使用Sleepy了,但是尝试使用-gdwarf-2编译,而不使用-g。我认为-g意味着调试信息的格式,然后-gdwrf-2不会覆盖它。上面提到的想法都不适合我(使用gcc版本4.9.1(i686-posix-dwarf-rev2,由MinGW-W64项目构建))谢谢!参数的顺序是否也相关?特别是-gdwarf-2
和-g
,例如,因为-g
可能触发不同的默认格式?将很快尝试测试,目前使用的-O2
。另外,我使用的是CMake,因此,二进制文件最终位于与源代码并行的目录中。也许有必要提供一些目录非常困倦?(尝试了很多符号搜索路径但没有成功)@SebastianK:你找到解决我们问题的方法了吗?我遇到了一些问题。使用“-gstabs+”编译似乎有帮助:符号在我的exe中得到了解决(我的自定义DLL中仍然存在一些问题,这些问题是应用程序动态加载的QT插件)。