Como posso definir um ponto de interrupção no código C ou C ++ programaticamente que funcionará para gdb no Linux?
Ie:
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
vez devoid main
.return 0
não é necessário e é apenas ruído!Respostas:
Uma maneira é sinalizar uma interrupção:
Em C:
ATUALIZAÇÃO : o MSDN afirma que o Windows não oferece suporte
SIGINT
, portanto, se a portabilidade for uma preocupação, é melhor você usá-loSIGABRT
.fonte
__debugbreak()
e NÃO__debug_break()
, como você pode ver aquiEm um projeto em que trabalho, fazemos o seguinte:
(No nosso caso, queríamos travar fortemente se isso acontecesse fora do depurador, gerando um relatório de falha, se possível. Esse é um dos motivos pelos quais usamos o SIGABRT. Fazer isso portável no Windows, Mac e Linux exigiu várias tentativas. Acabamos com algumas #ifdefs, útil comentado aqui: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)
fonte
breakpoint()
função em seu programa (pode estar vazia ou conter apenas uma instrução de impressão) e adicionarbreak breakpoint
ao seu~/.gdbinit
.Olhando aqui , descobri a seguinte maneira:
Isso me parece meio hackeado. E acho que isso só funciona na arquitetura x86.
fonte
cl.exe
) não oferece suporte a essa sintaxe, mas usa uma sintaxe diferente.int 3
gera um SIGTRAP.__asm__("int $3");
Deveria trabalhar:fonte
#define
disso, para não ter que lembrar a sintaxe. Eu tenho isso espalhado em todo o meu código, às vezes no lugar deassert()
, uma vez que parar o depurador me permite examinar todas as variáveis e a pilha. E, claro, como afirmar, não preciso removê-lo para o código de produçãoDecepcionante ver tantas respostas sem usar o sinal dedicado para pontos de interrupção de software
SIGTRAP
:fonte
No OS X você pode simplesmente ligar
std::abort()
(pode ser o mesmo no Linux)fonte