Установите точку останова в коде C или c++ программно для gdb на Linux


Как я могу установить точку останова в коде 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;
}
5 82

5 ответов:

одним из способов является сигнал прерывания:

#include <csignal>

// Generate an interrupt
std::raise(SIGINT);

В C:

#include <signal.h>
raise(SIGINT);

обновление: MSDN состояния что Windows на самом деле не поддерживает SIGINT, Так что если мобильность является проблемой, вы, вероятно, лучше использовать SIGABRT.

в проекте, над которым я работаю, мы делаем это:

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 .)

искать здесь, Я нашел следующий способ:

void main(int argc, char** argv)
{
    asm("int ");
    int a = 3;
    a++;  //  In gdb> print a;  expect result to be 3
}

Это кажется мне немного хакерским. И я думаю, что это работает только на архитектуре x86.

__asm__("int "); должно работать:

int main(int argc, char** argv)
{
    /* set breakpoint here! */
    int a = 3;
    __asm__("int ");
    a++;  /*  In gdb> print a;  expect result to be 3 */
    return 0;
}

на OS X вы можете просто позвонить std::abort() (Это может быть то же самое на Linux)