gdb: comment imprimer la ligne courante ou trouver le numéro de ligne courant?

94

list commandes imprime un ensemble de lignes, mais j'ai besoin d'une seule ligne, où je suis et où une erreur s'est probablement produite.

Boris Burkov
la source
23
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!

kumar_m_kiran
la source
1
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:

(gdb) frame
\#0  zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139         int rc = fq.recv (msg_);
(gdb)

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 .

user3162307
la source
21

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.

plus de détails ici

tous les registres disponibles lors de l'exécution gdb peuvent être affichés avec:

(gdb) info registers

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):

(gdb)info line *$rip

vous montrera le numéro de ligne et la source du fichier

(gdb) list *$rip

vous montrera cette ligne avec quelques avant et après

mais probablement

(gdb) frame

devrait suffire dans de nombreux cas.

Albfan
la source
2
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 ou frame peut être utilisé. où la commande donnera plus d'informations avec le nom de la fonction

pravu pp
la source
2

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.

Mazhar MIK
la source