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;
}
int main
plutôt quevoid main
.return 0
n'est pas nécessaire, cependant, et c'est juste du bruit!Réponses:
Une façon est de signaler une interruption:
En C:
MISE À JOUR : MSDN déclare que Windows ne prend pas vraiment en charge
SIGINT
, donc si la portabilité est un problème, vous feriez probablement mieux d'utiliserSIGABRT
.la source
__debugbreak()
et NON__debug_break()
, comme vous pouvez le voir iciDans un projet sur lequel je travaille, nous faisons ceci:
(Dans notre cas, nous voulions planter dur si cela se produisait en dehors du débogueur, générant un rapport d'erreur si possible. C'est l'une des raisons pour lesquelles nous avons utilisé SIGABRT. Faire cela de manière portative sous Windows, Mac et Linux a pris plusieurs tentatives. Nous nous sommes retrouvés avec quelques #ifdefs, commenté utilement ici: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)
la source
breakpoint()
fonction dans votre programme (elle peut être vide ou simplement contenir une instruction d'impression) et l'ajouterbreak breakpoint
à votre~/.gdbinit
.En regardant ici , j'ai trouvé le moyen suivant:
Cela me semble un peu hackish. Et je pense que cela ne fonctionne que sur l'architecture x86.
la source
cl.exe
) ne prend pas en charge cette syntaxe, mais utilise une syntaxe différente.int 3
lève un SIGTRAP.__asm__("int $3");
devrait marcher:la source
#define
ça, pour ne pas avoir à me souvenir de la syntaxe. Je l'ai saupoudré dans tout mon code, parfois à la place deassert()
, puisque l'arrêt du débiogueur m'a permis d'examiner toutes les variables et la pile. Et, bien sûr, comme l'affirmer, je n'ai pas à le supprimer pour le code de productionDécevant de voir autant de réponses de ne pas utiliser le signal dédié pour les points d' arrêt du logiciel,
SIGTRAP
:la source
Sur OS X, vous pouvez simplement appeler
std::abort()
(cela peut être la même chose sous Linux)la source