Comment entrer, passer et sortir avec GDB?

42

J'ai tapé helppendant que j'étais dans la BDG mais je n'ai rien trouvé à propos d'introduction, de remplacement et de sortie progressive. Je mets un point d'arrêt dans un programme d'assemblage dans _start( break _start). Ensuite, j'ai tapé nextet le débogage terminé. Je suppose que c'est parce qu'il a fini _startet n'a pas étape en tant que je voulais.

Quelqu'un qui peut aider?

Pichi Wuana
la source
Lisez l'intégralité de la documentation GDB. Si je me souviens bien, ils ont été très utiles à ce sujet lorsque je l'ai appris pour la première fois. Malheureusement, je n'ai pas eu besoin de déboguer un programme à ce niveau depuis plusieurs décennies, alors les commandes réelles semblent avoir été échangées dans mon cerveau. Donc, je ne peux pas vraiment écrire une réponse. Mais, si vous vous en rendez compte grâce aux manuels, vous pouvez alors répondre à votre propre question pour obtenir un bonus.
MAP
@ MAP Je vais essayer à nouveau. J'ai essayé d'utiliser un meilleur débogueur (KDbg) mais je n'ai pas réussi à l'utiliser dans Ubuntu .
Pichi Wuana

Réponses:

38

help running fournit quelques astuces:

Il y a stepet nextinstuctions (et aussi nextiet stepi).

(gdb) help next
Step program, proceeding through subroutine calls.
Usage: next [N]
Unlike "step", if the current source line calls a subroutine,
this command does not enter the subroutine, but instead steps over
the call, in effect treating it as a single source line.

Nous pouvons donc voir que les stepétapes dans les sous-routines, mais nextpassera sur les sous-routines.

Le stepet stepi(et le nextet nexti) distinguent par incréments de "ligne" ou "d'instruction".

step -- Step program until it reaches a different source line
stepi -- Step one instruction exactly

Connexes est finish:

(gdb) help finish
Execute until selected stack frame returns.
Usage: finish
Upon return, the value returned is printed and put in the value history.

Des informations plus utiles sont disponibles sur https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html

Stephen Harris
la source
Qu'est-ce que cela signifie jusqu'à ce qu'il atteigne une ligne source différente ?
Pichi Wuana
1
for(i=0;i<10;i++) { printf("%d\n",i); }est une ligne source mais plusieurs instructions.
Stephen Harris
3
Y a-t-il un moyen de sortir? Je ne pouvais pas le trouver dans l'aide en cours d'exécution.
nukeguy
1
Qu'entendez-vous par "pas à pas"? La finishcommande complète le cadre de pile actuel, qui termine normalement le sous-programme actuel et revient à l'appelant.
Stephen Harris
@PichiWuana gdb passera en revue autant d'instructions d'assemblage que nécessaire jusqu'à atteindre la première instruction représentant la prochaine ligne de code source
U007D
0

Je suis venu ici parce que j'avais la même question. J'ai finalement pensé que, chaque fois que je pouvais utiliser quelque chose comme une "sortie en boucle" d'une boucle, je pouvais simplement définir un autre point d'arrêt après la boucle, puis laisser le programme continueterminer la boucle et exécuter le point d'arrêt par la suite. Désolé si cela est évident pour la plupart des gens, mais c'est probablement utile pour quelqu'un qui cherche une réponse à cette question.

fjahr
la source