2017-05-19 37 views
3

我的命令行應用程序的用戶之一已經報告似乎是一個無限循環。當它處於這種狀態並且將它發送給我的時候,他們幫忙把這個過程轉儲(通過任務管理器)。我可以從Windows上的ghc Haskell進程轉儲中收集哪些信息?

我不知道如何從這個轉儲中獲得有用的信息。我的正常技術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 

回答

2

一些可能有用的資源。 (如果有更先進的最新的,我希望看到他們自己。)

幾個重要的掘金:

運行時標誌+RTS -?會告訴你什麼運行時標誌添加調試信息。這些將從+RTS -D開始。例如,+RTS -DS會打開許多​​運行時斷言和完整性檢查。

你看到的奇怪名字被編碼在一個叫Z編碼的東西里。這在https://ghc.haskell.org/trac/ghc/browser/ghc/compiler/cmm/CLabel.hs定義。

如果您可以重新編譯帶有調試符號和線程代碼的代碼,並且仍然會重現該錯誤,那麼可以在調試器中設置斷點(或命中控制-C)並從那裏回溯。你可以用像print/a 0x006eb0c0這樣的命令檢查內存(儘管你似乎在使用64位指針)。您可以看到與disassemble崩潰的彙編語言指令。

您需要使用-ddump-stg編譯標誌來查看變量名稱的含義,因爲這是程序彙編之前轉換的最後一個階段,您在調試器中看到的變量名稱與此處的對應。

您可以使用Debug.Trace來測試代碼。

+0

在行之間讀取,從我擁有的.dmp文件中可以獲得的很少。你會同意嗎? – chwarr

+0

我真的希望別人能告訴我更有用的東西。既然你有原始程序的源代碼,也許你可以在你的調試器內重現錯誤? – Davislor

+1

有道理。這一次,我很幸運地獲得更多細節,讓我能夠重現。下次,誰知道... :-) – chwarr

相關問題