web-dev-qa-db-fra.com

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?

I.e.:(

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

Une façon est de signaler une interruption:

#include <csignal>

// Generate an interrupt
std::raise(SIGINT);

En C:

#include <signal.h>
raise(SIGINT);

[~ # ~] met à jour [~ # ~] : états MSDN que Windows ne prend pas vraiment en charge SIGINT, donc si la portabilité est une préoccupation, vous feriez probablement mieux d'utiliser SIGABRT.

88
Håvard S

Dans un projet sur lequel je travaille, nous faisons ceci:

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

(Dans notre cas, nous voulions nous bloquer si cela se produisait en dehors du débogueur, en générant un rapport d'erreur si possible. C'est l'une des raisons pour lesquelles nous avons utilisé SIGABRT. #ifdefs, commenté utilement ici: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)

25
Jason Orendorff

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.

21
J. Polfer

__asm__("int $3"); devrait fonctionner:

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

Sous OS X, vous pouvez simplement appeler std::abort() (il peut en être de même sous Linux).

1
dacap