it-swarm.com.ru

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

Как программно установить точку останова в коде C или C++, которая будет работать для GDB в Linux?

I.e.:

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

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

#include <csignal>

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

В С:

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

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

88
Håvard S

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

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

25
Jason Orendorff

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

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

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

19
J. Polfer

__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;
}
10
hek2mgl

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

1
dacap