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에서도 동일 할 수 있음).