Установите точку останова в коде 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.