À distance de l'analyse post-mortem coredump sans avoir des symboles de débogage précis pour les bibliothèques de système partagés

StackOverflow https://stackoverflow.com/questions/4329986

Question

Comment obtenez-vous habituellement contourner ce problème? Imaginons qu'un fil se bloque à l'intérieur du code libc (qui est un système de bibliothèque partagée) sur Computer1 et génère ensuite un vidage. Mais le Computer2 sur lequel cette coredump analyse pourrait avoir une autre version de libc.

  1. Comment il est important d'avoir la même bibliothèque partagée sur l'ordinateur distant? Est-ce que le gdb correctement Reconstruire sans avoir stacktrace exactement la même version de libc sur Conputer2?

  2. Comment il est important d'avoir des symboles de débogage corrects pour libc? Est-ce que le gdb correctement Reconstruire sans avoir stacktrace symboles de débogage sur exactement le même COMPUTER2?

  3. Et quelle est la « bonne » pour éviter ce problème de non-concordance des symboles de débogage pour les bibliothèques système partagées? Pour moi, il semble qu'il n'y a pas de solution unique qui permet de résoudre ce problème d'une manière élégante? Peut-être que tout le monde peut partager son expérience?

Était-ce utile?

La solution

  1. Cela dépend. Sur certains processeurs, tels que x86_64, correct dérouleur descripteurs sont nécessaires pour GDB pour se détendre correctement la pile. Sur cette machine, l'analyse coredump avec libc non-appariement produira probablement des ordures complète.

  2. Vous ne symboles de débogage pas besoin de libc pour obtenir la trace de la pile. Vous ne voudriez pas obtenir des numéros de fichiers et ligne sans symboles de débogage, mais vous devez obtenir les noms de fonction correcte (sauf si inline a eu lieu).

  3. La prémisse de votre question est faux - symboles de débogage ont rien à voir avec cela. La « bonne » façon d'analyser coredump sur C2, quand ce coredump a été produit sur C1, est d'avoir une copie des bibliothèques de C1 (par exemple, dans /tmp/C1/lib/...) et direct GDB d'utiliser cette copie au lieu du C2 installé libc avec

    (gdb) set solib-absolute-prefix /tmp/C1

commande

.

Remarque : réglage ci-dessus doit être en vigueur avant de charger le noyau dans GDB. Ceci:

gdb exe core
(gdb) set solib-absolute-prefix /tmp/C1

ne fonctionnera pas (noyau est lu avant que le réglage est en vigueur).

Voici la bonne façon:

gdb exe
(gdb) set solib-absolute-prefix /tmp/C1
(gdb) core core

(j'ai essayé de trouver une référence à ce sur le web, mais ne l'a pas).

Quels sont les descripteurs déroulage?

descripteurs de dénouement sont nécessaires lorsque le code est compilé sans pointeurs de trame (par défaut pour x86_64 en mode optimisé). Ce code fait pas save% RBP registre, et ainsi GDB doit être dit comment « pas en arrière » du cadre actuel au cadre de l'appelant (ce processus est également connu sous le nom de déroulement pile).

Pourquoi pas la libc.so de C1 inclus dans le noyau?

Le fichier de base contient habituellement seulement le contenu des segments inscriptibles de l'espace d'adressage du programme. Les segments en lecture seule (où le code exécutable et les descripteurs déroulage résident) est généralement pas nécessaire -. Vous pouvez simplement les lire directement à partir libc.so sur le disque

Sauf cela ne fonctionne pas lorsque vous analysez le noyau de C1 sur C2!

Certains (mais pas tous) les systèmes d'exploitation permettent de configure « plein coredumps », où le système d'exploitation videra applications en lecture seule ainsi, vous pouvez donc analyser précisément noyau sur une machine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top