2015-12-08 3 views
0

J'ai écrit un programme simple, tout ce qu'il fait, c'est appeler une fonction appelée meller1, qui appelle meller2, et ainsi de suite jusqu'à ce que certaines fonctions appellent free et crash. Lors de l'exécution de gdb sur backtrace ce programme avec le fichier coredump, je reçois:Comment gdb backtrace sait de quelle bibliothèque provient chaque fonction?

gdb bt

Ma question est, comment gdb bt sait que le libre est tiré de /lib/libc.so.6? Existe-t-il une manière manuelle de le faire moi-même étant donné un fichier Coredump et l'exécutable lui-même? Merci.

Répondre

1

Ma question est, comment gdb bt sait-il que free est tiré de /lib/libc.so.6?

Ce n'est pas le cas. Tout GDB sait (au début) que le crash s'est produit à l'adresse 0xf7e3bf9c. Ensuite, GDB doit travailler à mapper cette adresse en quelque chose de significatif. La manière dont GDB le fait en regardant la carte du chargeur des images ELF actuelles pour trouver la bonne image - l'image qui "couvre" l'adresse donnée (cela lui donne /lib/libc.so.6), puis en lisant la table des symboles dans cette image ELF pour comprendre la fonction qui couvre l'adresse donnée (qui produit finalement le free).

Existe-t-il une manière manuelle de le faire moi-même étant donné un fichier Coredump et l'exécutable lui-même?

Bien sûr: GDB est juste un programme, et vous pouvez certainement écrire un autre programme qui exécuterait toutes les mêmes étapes. Cela ne vous prendra que quelques années pour écrire un tel programme.