我的命令行应用程序的一个用户报告了看似无限循环的内容。当它处于这种状态时,他们帮助转储了该过程(通过任务管理器)并将其发送给我。
我不确定如何从此转储中获取有用信息。我windbg -z the-dump-file.dmp -y releases\v5.0.0 -i releases\v5.0.0
的正常技巧并没有给我很多我知道如何解释的信息。我可以使用ghc特定的工具吗?
继续前进,我应该添加的构建选项或我应该对发布过程做的其他事情,以使这种事后调试更有成效吗?
这是我看到的堆栈的一个例子。没有太多有用的信息,特别是对于那些习惯在WinDbg中调试C / C ++代码的人。 : - )
0 Id: 112dc.cc18 Suspend: 1 Teb: 00000000`00341000 Unfrozen
*** ERROR: Module load completed but symbols could not be loaded for gbc.exe
# Child-SP RetAddr Call Site
00 00000000`01b7d8d0 00000000`01049f71 gbc+0xc5676e
01 00000000`01b7d930 00000000`0104b5b4 gbc+0xc49f71
02 00000000`01b7d9a0 00000000`0104c644 gbc+0xc4b5b4
03 00000000`01b7da60 00000000`0104c1fa gbc+0xc4c644
04 00000000`01b7dab0 00000000`0042545b gbc+0xc4c1fa
05 00000000`01b7db30 00000000`011c40a0 gbc+0x2545b
06 00000000`01b7db38 00000000`0535bee1 gbc+0xdc40a0
07 00000000`01b7db40 00000000`010ffd80 0x535bee1
08 00000000`01b7db48 00000000`0535bee1 gbc+0xcffd80
09 00000000`01b7db50 00007ffb`3581fb01 0x535bee1
0a 00000000`01b7db58 00007ffb`3581b850 imm32!?MSCTF_NULL_THUNK_DATA_DLB+0x2e9
0b 00000000`01b7db60 00000000`00000010 imm32!CtfImmGetCompatibleKeyboardLayout
0c 00000000`01b7db68 00000000`00000000 0x10
1 Id: 112dc.d324 Suspend: 1 Teb: 00000000`00349000 Unfrozen
# Child-SP RetAddr Call Site
00 00000000`05c2fc48 00007ffb`36441563 ntdll!ZwWaitForWorkViaWorkerFactory+0x14
01 00000000`05c2fc50 00007ffb`34172774 ntdll!TppWorkerThread+0x293
02 00000000`05c2ff60 00007ffb`36470d61 kernel32!BaseThreadInitThunk+0x14
03 00000000`05c2ff90 00000000`00000000 ntdll!RtlUserThreadStart+0x21
2 Id: 112dc.11b48 Suspend: 1 Teb: 00000000`0034b000 Unfrozen
# Child-SP RetAddr Call Site
00 00000000`0642dd38 00007ffb`32f2988f ntdll!ZwWaitForSingleObject+0x14
01 00000000`0642dd40 00000000`00ffca15 KERNELBASE!WaitForSingleObjectEx+0x9f
02 00000000`0642dde0 00000000`00000000 gbc+0xbfca15
答案 0 :(得分:2)
可能有用的一些资源。 (如果有更多最新的,我想亲自看看。)
一些重要的小块:
运行时标志+RTS -?
将告诉您哪些运行时标志添加调试信息。这些将从+RTS -D
开始。例如,+RTS -DS
打开了许多运行时断言和健全性检查。
您看到的奇怪名称是用Z编码编码的。这是在https://ghc.haskell.org/trac/ghc/browser/ghc/compiler/cmm/CLabel.hs定义的。
如果您可以重新编译带有调试符号和线程的代码,并且仍然重现该错误,您可以在调试器中设置断点(或命中control-C)并从那里进行回溯。您可以使用print/a 0x006eb0c0
之类的命令检查内存(尽管您似乎使用的是64位指针)。您可以看到与disassemble
崩溃的汇编语言指令。
您需要使用-ddump-stg
编译标志来查看变量名称的含义,因为这是程序汇编之前转换的最后阶段,并且您在调试器中看到的变量名称对应于在这里。
您可以使用Debug.Trace
来检测代码。