用mingw分析死后的崩溃

时间:2017-09-19 12:01:23

标签: debugging gdb windbg

我在cmake环境中使用ninja / mingw32 / msys2构建了一个Windows应用程序。我的用户遇到了崩溃,我无法弄清楚如何分析崩溃,因此我可以识别并解决问题。

二进制文件是使用cmake .. -GNinja -DCMAKE_BUILD_TYPE=Debug && ninja构建的,因此它在生成的可执行文件中内置了调试符号。

所以目前我有:

  1. 崩溃的二进制文件的精确副本,其中嵌入了调试符号。
  2. Windows崩溃后立即创建的转储文件(DMP)(右键单击Windows任务管理器中的进程)。
  3. 生成二进制文件的源代码。
  4. 搜索周围,我看到许多解释需要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“不是核心转储:文件格式无法识别

    有关如何调试此类崩溃的任何建议都表示赞赏,但我想我的具体问题是:

    1. mingw / gcc存在哪种符号文件,如何生成它们?
    2. 如何使用gdb加载Windows DMP文件?
    3. 如何在Windows中生成可由gdb读取的核心转储?
    4. 回答上述任何一个问题应该足以让我继续下去。

      这似乎是分析崩溃并且使用调试应该是微不足道的,但不知怎的,我在网上(以及在我的工作场所)找到的是很多非常困惑和不舒服的人,他们不知道如何去做。我可以在IDE中调试一些东西(使用通过msys环境中的CMakeLists.txt文件配置的QtCreator),但这无助于分析转储。

      我发现了一个非常好的博客,明确地说明了这个问题here但它建议使用cv2pdb,这是一个未预编译的应用程序,需要Visual Studio和nmake。

0 个答案:

没有答案