[c++] Linux의 gdb에 대해 프로그래밍 방식으로 C 또는 C ++ 코드에 중단 점 설정

Linux의 gdb에서 작동하는 프로그래밍 방식으로 C 또는 C ++ 코드에서 중단 점을 어떻게 설정할 수 있습니까?

즉 :

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



답변

한 가지 방법은 인터럽트 신호를 보내는 것입니다.

#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 $3");
    int a = 3;
    a++;  //  In gdb> print a;  expect result to be 3
}

이것은 나에게 터치 hackish처럼 보입니다. 그리고 이것은 x86 아키텍처에서만 작동한다고 생각합니다.


답변

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


답변

소프트웨어 중단 점에 대한 전용 신호를 사용하지 않고 너무 많은 답변을 보는 것이 실망 스럽습니다 SIGTRAP.

#include <signal.h>

raise(SIGTRAP); // At the location of the BP.


답변

OS X에서는 호출 만 할 수 있습니다 std::abort()(Linux에서도 동일 할 수 있음).


답변