C / C ++에서 프로그래밍 방식으로 코어 덤프를 발생시키는 방법
내 C ++ 응용 프로그램의 특정 위치에서 코어 덤프를 강제하고 싶습니다.
나는 다음과 같은 일을함으로써 그것을 할 수 있다는 것을 안다.
int * crash = NULL;
*crash = 1;
하지만 더 깨끗한 방법이 있는지 알고 싶습니다.
그런데 Linux를 사용하고 있습니다.
신호 번호 6 ( SIGABRT
Linux에서)을 올리는 것이이를 수행하는 한 가지 방법입니다 (그러나 모든 POSIX 구현에서 SIGABRT가 6 일 필요 는 없으므로 SIGABRT
quick'n이 아닌 경우 값 자체 를 사용하는 것이 좋습니다. '더러운 디버그 코드).
#include <signal.h>
: : :
raise (SIGABRT);
호출 abort()
도 코어 덤프의 원인이됩니다, 그리고 당신도 이렇게 할 수 없이 호출하여 프로세스를 종료 fork()
한 다음 abort()
아이가 만에 - 볼 이 답변 세부 사항을.
몇 년 전 Google은 coredumper 라이브러리를 출시했습니다 .
개요
coredumper 라이브러리를 응용 프로그램으로 컴파일하여 종료하지 않고 실행중인 프로그램의 코어 덤프를 만들 수 있습니다. 커널이 기본적으로 다중 스레드 코어 파일을 지원하지 않더라도 단일 및 다중 스레드 코어 덤프를 모두 지원합니다.
Coredumper는 BSD 라이선스 조건에 따라 배포됩니다.
예
이것은 결코 완전한 예가 아닙니다. coredumper API가 어떻게 생겼는지에 대한 느낌을 줄뿐입니다.
#include <google/coredumper.h> ... WriteCoreDump('core.myprogram'); /* Keep going, we generated a core file, * but we didn't crash. */
당신이 요구 한 것은 아니지만 아마도 더 좋을 것입니다 :)
에 나열된으로 신호 맨 '핵심'으로 표시된 조치에 어떤 신호가 코어 덤프를 강제 할 것이다. 몇 가지 예는 다음과 같습니다.
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGSEGV 11 Core Invalid memory reference
코어 덤프를 활성화했는지 확인하십시오.
ulimit -c unlimited
#include <stdlib.h> // C
//#include <cstdlib> // C++
void core_dump(void)
{
abort();
}
abort ();
관련, 때로는 실제 코어 덤프없이 역 추적을 원하고 프로그램이 계속 실행되도록 허용합니다. glibc backtrace () 및 backtrace_symbols () 함수를 확인하십시오. http://www.gnu.org/s/libc/ manual / html_node / Backtraces.html
코어 덤프를 생성하는 또 다른 방법 :
$ bash
$ kill -s SIGSEGV $$
bash의 새 인스턴스를 만들고 지정된 신호로 종료하면됩니다. 는 $$
쉘의 PID입니다. 그렇지 않으면 현재 bash를 죽이고 로그 아웃되고 터미널이 닫히거나 연결이 끊어집니다.
$ bash
$ kill -s SIGABRT $$
$ bash
$ kill -s SIGFPE $$
kill (2) 를 사용하여 신호를 보낼 수 있습니다 .
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
그래서,
kill(getpid(), SIGSEGV);
때로는 다음과 같이하는 것이 적절할 수 있습니다.
int st = 0;
pid_t p = fork();
if (!p) {
signal(SIGABRT, SIG_DFL);
abort(); // having the coredump of the exact copy of the calling thread
} else {
waitpid(p, &st, 0); // rip the zombie
}
// here the original process continues to live
이 간단한 접근 방식의 한 가지 문제점은 하나의 스레드 만 코어 덤프된다는 것입니다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("\n");
printf("Process is aborting\n");
abort();
printf("Control not reaching here\n");
return 0;
}
원하는 곳 에서이 접근 방식을 사용하십시오. :)
#include <assert.h>
.
.
.
assert(!"this should not happen");
참고URL : https://stackoverflow.com/questions/979141/how-to-programmatically-cause-a-core-dump-in-c-c
'code' 카테고리의 다른 글
HTML5 캔버스에 다각형을 그리는 방법은 무엇입니까? (0) | 2020.09.23 |
---|---|
Android에서 libGL.so를로드하지 못했습니다. (0) | 2020.09.23 |
JavaScript를 사용하여 HTML 테이블 데이터를 Excel로 내보내기 / JQuery가 Chrome 브라우저에서 제대로 작동하지 않습니다. (0) | 2020.09.23 |
Magento 제품 속성 값 가져 오기 (0) | 2020.09.23 |
배포 nodejs 패키지 (Ubuntu)를 사용하여 홈 디렉터리에 NPM 설치 (0) | 2020.09.23 |