programing

Linux에서 gdb의 C 또는 C++ 코드의 중단점을 프로그래밍 방식으로 설정합니다.

procenter 2022. 8. 10. 21:45
반응형

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.

여기를 보면, 다음과 같은 것을 알 수 있었습니다.

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

이건 좀 해킹적인 것 같아.이 기능은 x86 아키텍처에서만 사용할 수 있습니다.

제가 작업하는 프로젝트에서는 다음과 같은 작업을 수행합니다.

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 )

소프트웨어 중단점에 전용 신호를 사용하지 않는 답변이 많아 실망스럽지만,SIGTRAP:

#include <signal.h>

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

MSVC/MinGW 에서는,DebugBreak또는__debugbreak본질적인단순.#ifdef는, 양쪽의 케이스(POSIX 와 Win32)를 처리할 수 있습니다.

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

OS X에서는 전화만 하면 됩니다.std::abort()(Linux에서도 마찬가지일 수 있습니다)

언급URL : https://stackoverflow.com/questions/4326414/set-breakpoint-in-c-or-c-code-programmatically-for-gdb-on-linux

반응형