Установите точку останова в коде C или С++ программно для gdb в Linux
Как я могу установить контрольную точку в коде 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;
}
Ответы
Ответ 1
Один из способов - сигнализировать прерывание:
#include <csignal>
// Generate an interrupt
std::raise(SIGINT);
В C:
#include <signal.h>
raise(SIGINT);
UPDATE: MSDN заявляет, что Windows действительно не поддерживает SIGINT
, поэтому, если переносимость является проблемой, вам, вероятно, лучше использовать SIGABRT
.
Ответ 2
В проекте, над которым я работаю, мы делаем следующее:
raise(SIGABRT); /* To continue from here in GDB: "signal 0". */
(В нашем случае мы хотели сильно сработать, если это произошло за пределами отладчика, и, если возможно, генерировали отчет о сбоях. Это одна из причин, по которой мы использовали SIGABRT. Выполнение этой операции через Windows, Mac и Linux потребовало нескольких попыток. с несколькими #ifdefs, прокомментировал здесь: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66.)
Ответ 3
Посмотрев здесь, я нашел следующий путь:
void main(int argc, char** argv)
{
asm("int $3");
int a = 3;
a++; // In gdb> print a; expect result to be 3
}
Мне это кажется немного хакерским. И я думаю, что это работает только на архитектуре x86.
Ответ 4
__asm__("int $3");
должен работать:
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;
}
Ответ 5
В OS X вы можете просто вызвать std::abort()
(в Linux это может быть одинаково)
Ответ 6
Разочаровывает видеть столько ответов, не использующих выделенный сигнал для программных точек останова, SIGTRAP
:
#include <signal.h>
raise(SIGTRAP); // At the location of the BP.