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;
}
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
.
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 .)
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.
__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;
}
Sous OS X, vous pouvez simplement appeler std::abort()
(il peut en être de même sous Linux).