Как я могу программно установить точку останова в коде C или C ++, которая будет работать для gdb в Linux?
Т.е.:
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
а неvoid main
.return 0
не обязательно, это просто шум!Ответы:
Один из способов - сообщить о прерывании:
В C:
ОБНОВЛЕНИЕ : MSDN заявляет, что Windows на самом деле не поддерживает
SIGINT
, поэтому, если переносимость вызывает беспокойство, вам, вероятно, лучше использоватьSIGABRT
.источник
__debugbreak()
а НЕ__debug_break()
, как вы можете видеть здесьВ проекте, над которым я работаю, мы делаем следующее:
(В нашем случае мы хотели резко вывести из строя, если это произошло вне отладчика, создавая, если возможно, отчет о сбое. Это одна из причин, по которой мы использовали SIGABRT. Чтобы сделать это переносимо на Windows, Mac и Linux, потребовалось несколько попыток. В итоге мы получили несколько #ifdefs, здесь полезные комментарии: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)
источник
breakpoint()
в свою программу функцию (она может быть пустой или просто содержать оператор печати) и добавитьbreak breakpoint
в свой~/.gdbinit
.Заглянув сюда , я нашел следующий способ:
Мне это кажется хакерским. И я думаю, что это работает только на архитектуре x86.
источник
cl.exe
) не поддерживает этот синтаксис, но использует другой синтаксис.int 3
вызывает SIGTRAP.__asm__("int $3");
должно сработать:источник
#define
, так что мне не нужно запоминать синтаксис. Я разбрызгивал его по всему коду, иногда вместоassert()
, поскольку остановка отладчика позволяет мне исследовать все переменные и стек. И, конечно же, как и assert, мне не нужно удалять его для производственного кодаПрискорбно видеть так много ответов, не использующих выделенный сигнал для программных точек останова
SIGTRAP
:источник
В OS X вы можете просто позвонить
std::abort()
(это может быть то же самое в Linux)источник