117 votes

Définir des points d'arrêt dans le code C ou C ++ par programme pour gdb sous Linux

Comment puis-je définir un point d'arrêt dans le code C ou C ++ par programme qui fonctionnera pour gdb sous Linux?

C'est à dire:

 int main(int argc, char** argv)
{
    /* set breakpoint here! */
    int a = 3;
    a++;  /*  In gdb> print a;  expect result to be 3 */
    return 0;
}
 

117voto

Håvard S Points 11152

Une façon est de signaler une interruption:

 #include <csignal> // or signal.h if C code

// Generate an interrupt
raise(SIGINT);
 

MISE À JOUR : MSDN indique que Windows ne prend pas vraiment en charge SIGINT . Par conséquent, si la portabilité pose un problème, il vaut probablement mieux utiliser SIGABRT .

30voto

J. Polfer Points 5895

En regardant ici , j'ai trouvé le moyen suivant:

 void main(int argc, char** argv)
{
    asm("int $3");
    int a = 3;
    a++;  //  In gdb> print a;  expect result to be 3
}
 

Cela me semble un peu hackish. Et je pense que cela ne fonctionne que sur l'architecture x86.

29voto

Jason Orendorff Points 15869

Dans un projet sur lequel je travail, nous le faisons:

raise(SIGABRT);  /* To continue from here in GDB: "signal 0". */

(Dans notre cas, nous voulions crash dur si ce qui s'est passé en dehors du débogueur, la génération d'un rapport de crash, si possible. C'est une des raisons, nous avons utilisé SIGABRT. Faire cela de façon portable sur Windows, Mac, et Linux a fallu plusieurs tentatives. Nous nous sommes retrouvés avec un peu de #ifdefs, gentiment commenté ici: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)

2voto

J. Polfer Points 5895

Voici un article de blog sur la définition de points d'arrêt x86:

http://mainisusuallyafunction.blogspot.com/2012/01/embedding-gdb-breakpoints-in-c-source.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X