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
'programing' 카테고리의 다른 글
VueJS Vuex - 상태 변경 시 해결 약속? (0) | 2022.08.10 |
---|---|
Android에서 선택한 RadioGroup 인덱스를 가져오는 방법 (0) | 2022.08.10 |
여러 기준으로 결과를 필터링하려면 어떻게 해야 합니까? (0) | 2022.08.10 |
Vuex에 저장된 어레이에서 로컬 어레이를 편집하는 방법 (0) | 2022.08.10 |
Vue/Laravel에서 구글 맵 사용 (0) | 2022.08.10 |