2

我正在关注此网址中的注释

我在我的代码(Qt、Windows、VS 2015)上编译了它,我在调试模式下运行它,当它崩溃时,我执行以下操作:

创建符号文件

dump_syms.exe ZendeskClient.exe > ZendeskClient.sym

使用dmp和符号文件生成文本文件(各试一试)

minidump_stackwalk.exe filename.dmp symbols > ZendeskClient.txt 2>&1
minidump_stackwalk.exe filename.dmp ZendeskClient.sym > ZendeskClient1.txt 2>&1
minidump_stackwalk.exe filename.dmp ZendeskClient.sym symbols > ZendeskClient2.txt 2>&1

但我没有看到任何显示导致应用程序崩溃的原因。我在文本中看到(600 行)(它不是所有的信息,只是希望显示我想要显示的内容。其余的数据有些相同):

2016-04-20 21:00:32: minidump_processor.cc:264: INFO: Processing minidump in file C:\Users\adviner\c62072b9-3bf7-42b6-b6f2-28c3ccf9546f.dmp
2016-04-20 21:00:32: minidump.cc:3500: INFO: Minidump opened minidump C:\Users\adviner\c62072b9-3bf7-42b6-b6f2-28c3ccf9546f.dmp
2016-04-20 21:00:32: minidump.cc:3545: INFO: Minidump not byte-swapping minidump
2016-04-20 21:00:32: minidump.cc:3902: INFO: GetStream: type 1197932546 not present
2016-04-20 21:00:32: minidump.cc:1945: INFO: MinidumpModule could not determine version for C:\Projects\PersonalApps\Build\Windows\ZendeskClient\debug\ZendeskClient.exe
2016-04-20 21:00:32: minidump_processor.cc:116: INFO: Minidump C:\Users\adviner\c62072b9-3bf7-42b6-b6f2-28c3ccf9546f.dmp has CPU info, OS info, 

....

CPU: x86
     GenuineIntel family 6 model 78 stepping 3
     4 CPUs

Crash reason:  EXCEPTION_ACCESS_VIOLATION_READ
Crash address: 0xffffffffcdcdcddd

Thread 0 (crashed)
 0  ntdll.dll + 0x76bfc
    eip = 0x77bc6bfc   esp = 0x0018bb08   ebp = 0x0018bb78   ebx = 0x00000001
    esi = 0x00000000   edi = 0x000001fc   eax = 0x00000000   ecx = 0xcdcdcddd
    edx = 0x0018c570   efl = 0x00200202
    Found by: given as instruction pointer in context
 1  KERNELBASE.dll + 0xae131
    eip = 0x7795e132   esp = 0x0018bb80   ebp = 0x0018bb8c
    Found by: previous frame's frame pointer
 2  ZendeskClient.exe + 0xfcf3f
    eip = 0x002fcf40   esp = 0x0018bb94   ebp = 0x0018bba4
    Found by: previous frame's frame pointer
 3  ZendeskClient.exe + 0xfc9e7
    eip = 0x002fc9e8   esp = 0x0018bbac   ebp = 0x0018bbe4
    Found by: previous frame's frame pointer
 4  KERNELBASE.dll + 0x13f471
    eip = 0x779ef472   esp = 0x0018bbec   ebp = 0x0018bc74
    Found by: previous frame's frame pointer
 5  ntdll.dll + 0xa35ed
    eip = 0x77bf35ee   esp = 0x0018bc7c   ebp = 0x0018fb8c
    Found by: previous frame's frame pointer
 6  ntdll.dll + 0x65dad
    eip = 0x77bb5dae   esp = 0x0018fb94   ebp = 0x0018fb9c
    Found by: previous frame's frame pointer

...

Loaded modules:
0x00200000 - 0x003e9fff  ZendeskClient.exe  ???  (main)
0x00bf0000 - 0x00d62fff  ucrtbased.dll  10.0.10240.16384
0x02490000 - 0x024b2fff  WINMMBASE.dll  6.2.10586.0
0x02650000 - 0x0266cfff  qicnsd.dll  5.6.0.0
0x029d0000 - 0x02bc8fff  qwindowsd.dll  5.6.0.0
0x02d50000 - 0x02d68fff  qicod.dll  5.6.0.0
0x02d70000 - 0x02d85fff  qsvgd.dll  5.6.0.0
0x02d90000 - 0x02da4fff  qtgad.dll  5.6.0.0
0x02dd0000 - 0x02f0efff  dbghelp.dll  6.2.10586.0

我构建输出的方式有问题吗?顺便说一句,我在 Windows 上

4

1 回答 1

0

答案对于 Windows 上的调试实践是通用的。当您编译/链接您的项目时, Microsoft Visual C++ 构建工具会生成程序数据库文件格式的输出。然后当程序崩溃时,您会获得 .dmp 或 minidump 文件,您可以使用特定的函数名称/行展开堆栈。

如何使用转储文件进行实际调试?您可以将此答案用作 Wiki 来使用 dmp 和 pdb 文件进行调试:Analyzing Crash dumps in Visual Studio。只需使用 Visual Studio 打开转储文件,然后指向程序数据库,然后指向源代码,您将看到崩溃时所有线程/堆栈的图片。

更新:我们也可以“符号化”没有名称的“空”转储作为回答:stackwalker 加载所有符号文件,但仍然没有符号化任何东西。我猜工具名称是minidump_stackwalk

于 2016-04-21T04:40:26.620 回答