Установить точку останова в коде C или C ++ программно для GDB в Linux - PullRequest
87 голосов
/ 01 декабря 2010

Как программно установить точку останова в коде 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 ]

88 голосов
/ 01 декабря 2010

Один из способов - сообщить о прерывании:

#include <csignal>

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

В С:

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

ОБНОВЛЕНИЕ : MSDN сообщает , что Windowsна самом деле не поддерживает SIGINT, поэтому, если переносимость является проблемой, вам, вероятно, лучше использовать SIGABRT.

25 голосов
/ 01 декабря 2010

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

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

19 голосов
/ 01 декабря 2010

Посмотрев здесь , я нашел следующий путь:

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

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

10 голосов
/ 16 марта 2015

__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;
}
1 голос
/ 25 июня 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...