backtraceou where, même info lineou simplement bt(pour la trace). dirac.org/linux/gdb pour un tutoriel gdb
dwalter
btou backtraceou whereimprimer la pile d'appels de fonction, fou frameimprimer la ligne suivante à exécuter.
Eric Wang le
Réponses:
21
J'obtiens les mêmes informations lors du débogage. Mais pas pendant que je vérifie le stacktrace. Vous auriez probablement utilisé l'indicateur d'optimisation, je pense. Vérifiez ce lien - quelque chose de lié.
Essayez de compiler en -g3supprimant tout indicateur d'optimisation. Alors ça pourrait marcher. HTH!
Ah, bien que mon programme ait été compilé avec -gpour contenir des informations de débogage, je suis actuellement dans un cadre de pile, pris dans l'une des bibliothèques partagées, qui n'a apparemment pas été compilé pour contenir des informations de ligne. Merci, kumar.
Boris Burkov
104
La commande 'frame' vous donnera ce que vous recherchez. (Cela peut être abrégé simplement «f»). Voici un exemple:
Sans argument, 'frame' vous indique simplement où vous en êtes (avec un argument, il change le frame). Vous trouverez plus d'informations sur la commande frame ici .
Gardez à l'esprit que gdb est une commande puissante - capable d'instructions de bas niveau - est donc liée aux concepts d'assemblage.
Ce que vous recherchez s'appelle de pointeur d'instruction, c'est-à-dire:
Le registre de pointeur d'instructions pointe vers l'adresse mémoire que le processeur tentera ensuite d'exécuter. Le pointeur d'instruction est appelé ip en mode 16 bits, eip en mode 32 bits et rip en mode 64 bits.
GDB ne prend pas en charge le mode 16 bits je crois, donc ipn'est jamais utilisé ici. En outre, au lieu d'orthographe explicitement le nom du compteur de programme, vous pouvez utiliser l'alias de GDB pour elle: $pc. Donc x/10i $pcva démonter 10 instructions au pointeur d'instruction actuel quelle que soit l'architecture - cela fonctionnera sur i386, x86_64, ARM etc.
Ruslan
19
Commande où ou frame peut être utilisé. où la commande donnera plus d'informations avec le nom de la fonction
Toutes les réponses ci-dessus sont correctes, ce que je préfère est d'utiliser le mode tui (ctrl + XA) qui montre votre emplacement et la fonction dans une fenêtre séparée, ce qui est très utile pour les utilisateurs. J'espère que cela aide aussi.
backtrace
ouwhere
, mêmeinfo line
ou simplementbt
(pour la trace). dirac.org/linux/gdb pour un tutoriel gdbbt
oubacktrace
ouwhere
imprimer la pile d'appels de fonction,f
ouframe
imprimer la ligne suivante à exécuter.Réponses:
J'obtiens les mêmes informations lors du débogage. Mais pas pendant que je vérifie le stacktrace. Vous auriez probablement utilisé l'indicateur d'optimisation, je pense. Vérifiez ce lien - quelque chose de lié.
Essayez de compiler en
-g3
supprimant tout indicateur d'optimisation. Alors ça pourrait marcher. HTH!la source
-g
pour contenir des informations de débogage, je suis actuellement dans un cadre de pile, pris dans l'une des bibliothèques partagées, qui n'a apparemment pas été compilé pour contenir des informations de ligne. Merci, kumar.La commande 'frame' vous donnera ce que vous recherchez. (Cela peut être abrégé simplement «f»). Voici un exemple:
Sans argument, 'frame' vous indique simplement où vous en êtes (avec un argument, il change le frame). Vous trouverez plus d'informations sur la commande frame ici .
la source
Gardez à l'esprit que gdb est une commande puissante - capable d'instructions de bas niveau - est donc liée aux concepts d'assemblage.
Ce que vous recherchez s'appelle de pointeur d'instruction, c'est-à-dire:
plus de détails ici
tous les registres disponibles lors de l'exécution gdb peuvent être affichés avec:
avec lui, vous pouvez trouver quel mode votre programme est en cours d'exécution (en regardant lequel de ces registres existe)
alors (ici en utilisant le rip de registre le plus courant de nos jours, remplacez-le par eip ou très rarement ip si nécessaire):
vous montrera le numéro de ligne et la source du fichier
vous montrera cette ligne avec quelques avant et après
mais probablement
devrait suffire dans de nombreux cas.
la source
ip
n'est jamais utilisé ici. En outre, au lieu d'orthographe explicitement le nom du compteur de programme, vous pouvez utiliser l'alias de GDB pour elle:$pc
. Doncx/10i $pc
va démonter 10 instructions au pointeur d'instruction actuel quelle que soit l'architecture - cela fonctionnera sur i386, x86_64, ARM etc.Commande où ou frame peut être utilisé. où la commande donnera plus d'informations avec le nom de la fonction
la source
Toutes les réponses ci-dessus sont correctes, ce que je préfère est d'utiliser le mode tui (ctrl + XA) qui montre votre emplacement et la fonction dans une fenêtre séparée, ce qui est très utile pour les utilisateurs. J'espère que cela aide aussi.
la source