我可以从Windows上的ghc Haskell进程转储中收集哪些信息?

时间:2017-05-19 23:28:08

标签: windows haskell windbg ghc dump

我的命令行应用程序的一个用户报告了看似无限循环的内容。当它处于这种状态时,他们帮助转储了该过程(通过任务管理器)并将其发送给我。

我不确定如何从此转储中获取有用信息。我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

1 个答案:

答案 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来检测代码。