Débogage post-mortem d’un programme compilé par Mono AOT

J’ai un programme volumineux, écrit en C # et exécuté sur des systèmes Linux utilisant Mono, qui tombe occasionnellement en panne et provoque le mono.bin du mono.bin processus mono.bin .

J’ai exécuté gdb sur certains des fichiers core dump, mais ce n’était pas très utile car les backtraces ne contenaient pas les noms des fonctions C #. Selon cette discussion, j’ai trouvé :

Cela ne marchera pas. Les informations nécessaires à la construction des traces de stack gérées sont contenues dans les structures de données d’exécution et ne sont disponibles que pendant l’exécution du programme. Vous pouvez AOT votre application, vous aurez alors plus de traces de stack utilisables.

Donc j’ai fait. J’ai compilé tous mes fichiers DLL et EXE C #. En utilisant l’ --aot=write-symbols . Pour une version de test de mon programme qui se bloque intentionnellement , je pourrais vérifier si cela rend les backtraces plus utiles. Et jusqu’à présent, ce n’est pas le cas. Le backtrace du thread principal ressemble à:

 #0 0xb7fc8402 in __kernel_vsyscall () #1 0x00556df0 in raise () from /lib/libc.so.6 #2 0x00558701 in abort () from /lib/libc.so.6 #3 0x080e59b5 in ?? () 

Un autre thread a:

 #0 0xb7fc8402 in __kernel_vsyscall () #1 0x005f6753 in poll () from /lib/libc.so.6 #2 0xb6f735a7 in Mono_Unix_UnixSignal_WaitAny () from /opt/novell/mono/lib/libMonoPosixHelper.so #3 0xb5416578 in ?? () 

Et d’autres threads semblent avoir été inactifs (en nanosleep , pthread_cond_timedwait , pthread_cond_wait , sem_timedwait ou sem_wait ). Mais ce que tous les backtraces ont en commun, c’est qu’ils finissent par s’en vexer in ?? () in ?? () , et ne répertoriez jamais aucun nom de fonction de “mon” code.

Je pense que cela est lié à certains messages imprimés par gdb démarrage; par exemple,

 Reading symbols from /xyz/mono/log4net.dll.so...(no debugging symbols found)...done. Loaded symbols for /xyz/mono/log4net.dll.so Reading symbols from /xyz/mono/Contoso.Util.dll.so...(no debugging symbols found)...done. Loaded symbols for /xyz/mono/Contoso.Util.dll.so Reading symbols from /xyz/mono/Contoso.Printing.dll.so...(no debugging symbols found)...done. Loaded symbols for /xyz/mono/Contoso.Printing.dll.so Reading symbols from /xyz/mono/Contoso.LegacyDataConverter.dll.so...(no debugging symbols found)...done. Loaded symbols for /xyz/mono/Contoso.LegacyDataConverter.dll.so 

Pourquoi tous les fichiers *.dll.so ne contiennent-ils “aucun symbole de débogage”? Les DLL elles-mêmes doivent-elles être construites en mode “debug” ou autre chose?

Et plus généralement, existe-t-il un moyen d’obtenir la trace de la stack gérée à partir d’un fichier core Mono? (Sans utiliser mono_pmip , car cela n’est disponible que lorsque le processus est en cours d’exécution)

Serait-il possible de définir suspend-on-sigserv puis attacher lorsque le processus se bloque? Je suppose que c’est un environnement en direct, donc peut-être pas possible.

Si vous pouvez le faire, vous devriez être en mesure de trouver l’information que vous recherchez.

De la documentation :

MONO_DEBUG

Si défini, active certaines fonctionnalités du runtime utiles pour le débogage. Cette variable doit contenir une liste d’options de débogage séparées par des virgules. Actuellement, les options suivantes sont sockets en charge:

suspendre sur sigsegv

Cette option suspend le programme lorsqu’un SIGSEGV natif est reçu. Ceci est utile pour le débogage des plantages qui ne se produisent pas sous gdb, car un processus en direct contient plus d’informations qu’un fichier core.

Je n’ai aucune idée de mono .. Mais de regarder stacktrace fourni .. il ne peut pas obtenir de symboles pour mono-runtime. voici le lien qui donne le débogage avec gdb. Vous avez besoin d’un mono-runtime avec des symboles, c’est-à-dire so bibliothèque avec des symboles … Vous devez donc installer mono-runtime-dbg … Vous pouvez utiliser des outils comme apt-get, yum, wget pour l’installer.

Je me suis désinstallé .. qui montre la sortie suivante ….

 $ apt-cache search mono-runtime-dbg mono-runtime-dbg - Mono runtime, debugging symbols Then $ apt-get install mono-runtime-dbg 

J’espère que vous trouverez cela utile …