Question attendre que gdb se connecte [dupliquer]


Cette question a déjà une réponse ici:

J'utilise normalement gdb pour 1 ou 2 projets. C'est à dire. J'invoque gdb --args prog args . gdb s'exécute dans le même tty que le programme que je débogue.

Cependant, mon dernier projet modifie l'utilitaire dtach. Ceci est un programme comme un écran, donc les tty sont redirigés ailleurs, donc je dois utiliser les fonctionnalités de attachement de gdb.

Le problème avec gdb attach est que, de toute évidence, vous ne pouvez pas vous y attacher dès le début car vous devez d'abord exécuter le programme pour obtenir un pid auquel s'attacher.

Est-ce que je peux obtenir un programme pour attendre que gdb soit attaché?

Je ne peux pas utiliser gdbserver car je suis sur cygwin. Aussi j'ai essayé d'utiliser pause(), mais ça a pendu quand j'ai essayé de continuer.


10
2018-06-29 01:40


origine


Réponses:


Voici comment je résous ce problème. J'ai aussi vu d'autres personnes faire ce tour.

Choisissez un endroit où vous souhaitez que votre programme s'arrête et attendez que vous attachiez le débogueur. Pour la plupart des programmes, ce sera le début, mais s'il y a des travaux d'initialisation dont vous avez besoin, vous voudrez peut-être les terminer et le faire ensuite.

Mettez dans une boucle similaire à ceci:

#ifdef DEBUG

int i = 0;

while (i == 0)
{
    usleep(100000);  // sleep for 0.1 seconds
}

#endif // DEBUG

Une fois que vous avez réussi à vous connecter au processus, vous pouvez utiliser le débogueur pour modifier la valeur de la variable. i, ce qui va briser la boucle et permettre à l'exécution normale de continuer.

La commande gdb pour changer la variable à 1: set var i = 1

Une autre chose que je fais tout le temps: je définis une fonction courte appelée nop() ça ne fait rien ("pas d'opération"). Ensuite, je reste dans un appel à nop() n'importe où je veux briser, et mettre un point d'arrêt à l'intérieur nop().

Remarque: si vous construisez votre version de débogage avec -O0 alors le compilateur n'optimisera pas la variable. Si vous aviez besoin de cette astuce pour travailler avec une version optimisée, vous devez déclarer la variable comme volatile.


12
2018-06-29 03:05



Au moins avec LLDB rendant le processus d'envoi SIGSTOP à soi-même devrait faire l'affaire. Le débogueur continue à émettre la commande SIGCONT. Cela devrait fonctionner avec GDB aussi. Sinon, essayez SIGINT au lieu de SIGSTOP.

Inclure l'en-tête

#include <signal.h>
#include <csignal> // or C++ style alternative

puis

raise(SIGSTOP)

9
2018-06-01 16:00



Certaines plates-formes peuvent avoir des instructions wait-for-debugger ou des interruptions.

Plus portablement, vous pouvez faire en sorte que le programme attende une condition externe satisfaisante, telle qu'une connexion à un socket ou l'écriture de certaines données dans un fichier fifo. Vous pouvez ensuite établir la connexion ou envoyer des données factices depuis un troisième terminal.

Ou vous pourriez mettre une boucle infinie dans le programme, en testant la valeur d'une variable volatile que vous modifieriez avec le débogueur pour lui permettre de continuer.

Si je me souviens bien, vous pouvez utiliser windows apis dans les programmes cygwin, et certaines recherches sur le Web semblent en indiquer une pour détecter si le programme est en cours de débogage.


1
2018-06-29 02:55