2017-05-19 3 views
3

Un des utilisateurs de mon application de ligne de commande a signalé ce qui semble être une boucle infinie. Ils ont utilement pris une décharge du processus (via le Gestionnaire des tâches) pendant qu'il était dans cet état et me l'ont envoyé.Quelles informations puis-je glaner d'un vidage d'un processus ghc Haskell sous Windows?

Je ne sais pas comment obtenir des informations utiles sur cette image. Ma technique habituelle de windbg -z the-dump-file.dmp -y releases\v5.0.0 -i releases\v5.0.0 ne me donne pas beaucoup d'informations que je sais interpréter. Y a-t-il des outils spécifiques à ghc que je peux utiliser à la place? Dans l'avenir, les options de construction que je devrais ajouter ou d'autres choses que je devrais faire dans mon processus de publication pour rendre ce débogage post-mortem plus fructueux?

Voici un exemple des piles que je vois. Pas beaucoup d'informations utiles, en particulier pour quelqu'un utilisé pour déboguer le code C/C++ dans WinDbg. :-)

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 

Répondre

2

Certaines ressources pourraient être utiles. (S'il y a plus de ceux mis à jour, je voudrais les voir moi-même.)

Quelques pépites importantes:

L'indicateur d'exécution +RTS -? Vous indiquera les indicateurs d'exécution qui ajoutent des informations de débogage. Ceux-ci commenceront par +RTS -D. Par exemple, +RTS -DS active un certain nombre d'assertions d'exécution et de vérifications d'intégrité.

Les noms étranges que vous voyez sont codés dans quelque chose appelé codage Z. Ceci est défini à https://ghc.haskell.org/trac/ghc/browser/ghc/compiler/cmm/CLabel.hs.

Si vous pouvez recompiler le code avec les symboles de débogage et l'enfilage et continuer à reproduire le bogue, vous pouvez définir des points d'arrêt (ou frapper le contrôle C) dans le débogueur et le backtrace à partir de là. Vous pouvez examiner la mémoire avec une commande comme print/a 0x006eb0c0 (même si vous semblez utiliser des pointeurs 64 bits). Vous pouvez voir l'instruction en langage assembleur qui s'est plantée avec disassemble. Vous devez utiliser l'indicateur de compilation -ddump-stg pour voir ce que les noms de variables signifient, car c'est la dernière phase de la transformation avant l'assemblage du programme, et les noms de variables que vous voyez dans le débogueur correspondent à ceux ici. Vous pouvez utiliser le code Debug.Trace.

+0

En lisant entre les lignes, il y a très peu de choses qui peuvent être obtenues à partir du fichier .dmp que j'ai. Accepteriez-vous? – chwarr

+0

J'espérais honnêtement que quelqu'un d'autre serait en mesure de me dire quelque chose de plus utile. Puisque vous avez le code source du programme original, peut-être que vous pouvez reproduire le bogue dans votre débogueur? – Davislor

+1

Cela a du sens. Cette fois, j'ai eu la chance d'obtenir plus de détails qui me permettent de reproduire. La prochaine fois, qui sait ... :-) – chwarr