list
imprime un ensemble de lignes, mais j'ai besoin d'une seule ligne, où je suis et où une erreur s'est probablement produite.
Réponses
Trop de publicités?La commande 'frame' vous donnera ce que vous cherchez. (Elle peut être abrégée en '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, "cadre" vous indique simplement où vous en êtes (avec un argument, il change le cadre). Vous trouverez plus d'informations sur la commande frame aquí .
J'obtiens les mêmes informations en déboguant. Mais pas lorsque je vérifie le suivi de pile. Je pense que vous avez probablement utilisé le drapeau d'optimisation. Vérifiez ceci lien - quelque chose de connexe.
Essayez de compiler avec -g3
supprimer tout drapeau d'optimisation. Alors cela pourrait fonctionner. HTH !
Gardez à l'esprit que gdb est une commande puissante - capable d'exécuter des instructions de bas niveau - et qu'elle est liée aux concepts d'assemblage.
Ce que vous cherchez s'appelle un pointeur d'instruction, c'est à dire
Le registre du pointeur d'instruction pointe vers l'adresse mémoire que le processeur va tenter 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 aquí
tous les registres disponibles lors de l'exécution de gdb peuvent être affichés avec :
(gdb) info registers
avec cela vous pouvez trouver quel mode votre programme est en cours d'exécution (en regardant lesquels de ces registres existent)
puis (en utilisant ici le registre le plus courant) rip aujourd'hui, remplacer par eip ou très rarement ip si nécessaire) :
(gdb)info line *$rip
vous montrera le numéro de ligne et le fichier source
(gdb) list *$rip
vous montrera cette ligne avec quelques avant et après
mais probablement
(gdb) frame
devrait suffire dans de nombreux cas.