Quelles informations puis-je tirer d’un vidage d’un processus ghc Haskell sous Windows?

L’un des utilisateurs de mon application en ligne de commande a signalé ce qui semble être une boucle infinie. Ils ont utilement pris un vidage du processus (via le Gestionnaire des tâches) pendant qu’il était dans cet état et me l’ont envoyé.

Je ne sais pas comment extraire des informations utiles de ce vidage. 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. Existe-t-il des outils spécifiques aux ghc que je peux utiliser à la place?

En allant de l’avant, les options de compilation que je devrais append sont-elles d’autres choses que je devrais faire dans mon processus de publication pour rendre ce type de débogage post-mortem plus fructueux?

Voici un exemple des stacks que je vois. Pas beaucoup d’informations utiles, en particulier pour quelqu’un qui a l’habitude de déboguer du 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 

    Quelques ressources qui pourraient être utiles. (S’il y en a d’autres plus à jour, j’aimerais les voir moi-même.)

    Quelques pépites importantes:

    Le drapeau d’exécution +RTS -? Vous indiquera quels indicateurs d’exécution ajoutent des informations de débogage. Celles-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 encodés dans quelque chose appelé encodage en Z. Ceci est défini à https://ghc.haskell.org/trac/ghc/browser/ghc/comstackr/cmm/CLabel.hs .

    Si vous pouvez recomstackr le code avec les symboles de débogage et le désactiver, et que vous reproduisez toujours le bogue, vous pouvez définir des points d’arrêt (ou contrôler le contrôle C) à l’intérieur du débogueur et de la trace. Vous pouvez examiner la mémoire avec une commande comme print/a 0x006eb0c0 (bien que vous sembliez utiliser des pointeurs 64 bits). Vous pouvez voir l’instruction en langage d’assemblage qui s’est écrasé lors du disassemble .

    Vous devez utiliser l’ -ddump-stg compilation -ddump-stg pour voir ce que les noms de variable signifient, car c’est la dernière phase de la transformation avant l’assemblage du programme, et les noms de variable que vous voyez dans le débogueur correspondent à ceux ici.

    Vous pouvez instrumenter le code avec Debug.Trace .