【问题标题】:What information can I glean from a dump of a ghc Haskell process on Windows?我可以从 Windows 上的 ghc Haskell 进程转储中收集哪些信息?
【发布时间】:2017-05-19 23:28:08
【问题描述】:

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

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

【问题讨论】:

    标签: windows haskell windbg ghc dump


    【解决方案1】:

    一些可能有用的资源。 (如果有更多最新的,我想亲自看看。)

    一些重要的掘金:

    运行时标志+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 检测代码。

    【讨论】:

    • 从字里行间看,从我拥有的 .dmp 文件中可以得到的信息很少。你同意吗?
    • 老实说,我希望其他人能够告诉我一些更有用的东西。既然你有原始程序的源代码,也许你可以在你的调试器中重现这个错误?
    • 有道理。这一次,我很幸运得到了更多的细节,可以让我重现。下一次,谁知道... :-)
    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多