我在cmake
环境中使用ninja
/ mingw32
/ msys2
构建了一个Windows应用程序。我的用户遇到了崩溃,我无法弄清楚如何分析崩溃,因此我可以识别并解决问题。
二进制文件是使用cmake .. -GNinja -DCMAKE_BUILD_TYPE=Debug && ninja
构建的,因此它在生成的可执行文件中内置了调试符号。
所以目前我有:
搜索周围,我看到许多解释需要pdb文件(特定于MSVC),但我没有其中一个。我并不反对生成pdb文件(或Mingw等效文件),但每个人都说使用-g
。这不会创建一个pdb文件,只是将符号嵌入到可执行文件中,我已经有了。
ninja生成的编译/定义如下所示:
C:\msys64\mingw32\bin\c++.exe
-D<Defines>
-I<Includes>
-isystem C:/msys64/mingw32/include
-g -MD -MT <object>.obj
-MF <object>.obj.d
-o <object>.obj
-c <object>.cpp
C:\msys64\mingw32\bin\c++.exe
-g <object1>.obj <object2>.obj <objectN>.obj
-o <Application>.exe
-Wl,--major-image-version,0,--minor-image-version,0
<library1>.dll.a <library2>.dll.a
-l<systemlib1> -l<systemlib2>
我已尝试使用windbg加载* .DMP文件,但未指定符号文件,它实际上不提供任何信息。我已经尝试将exectuable本身作为我的符号文件加载,但windbg似乎没有响应。
我已尝试使用gdb
加载* .DMP,但我收到此错误:
.DMP“不是核心转储:文件格式无法识别
有关如何调试此类崩溃的任何建议都表示赞赏,但我想我的具体问题是:
回答上述任何一个问题应该足以让我继续下去。
这似乎是分析崩溃并且使用调试应该是微不足道的,但不知怎的,我在网上(以及在我的工作场所)找到的是很多非常困惑和不舒服的人,他们不知道如何去做。我可以在IDE中调试一些东西(使用通过msys环境中的CMakeLists.txt文件配置的QtCreator),但这无助于分析转储。
我发现了一个非常好的博客,明确地说明了这个问题here但它建议使用cv2pdb,这是一个未预编译的应用程序,需要Visual Studio和nmake。