code

C 프로그램이 종료하지 않고 코어 덤프를 생성할 수 있는 방법은 무엇입니까?

starcafe 2023. 10. 5. 23:25
반응형

C 프로그램이 종료하지 않고 코어 덤프를 생성할 수 있는 방법은 무엇입니까?

나는 특정 상황에서 코어 덤프를 생산하기 위한 C 프로그램을 원합니다.이것은 프로덕션 환경에서 실행되는 프로그램으로, 다른 종류의 디버깅 코드를 조정하기 위해 쉽게 중지되고 다시 시작되지 않습니다.또한 프로덕션 환경이기 때문에 abort()라고 부르고 싶지 않습니다.조사 중인 문제는 비생산 환경에서 쉽게 복제되지 않습니다.제가 원하는 것은 프로그램이 특정 문제를 감지할 때, 가능하면 파일 이름을 바꿀 수 있는 충분한 정보를 가지고 코어 덤프를 자체적으로 생성한 후 계속하는 것입니다.

void create_dump(void)
{
    if(!fork()) {
        // Crash the app in your favorite way here
        *((void*)0) = 42;
    }
}

프로세스를 포크한 다음 아이를 크래시합니다. 원할 때마다 스냅샷을 제공합니다.

Google Coredumper 라이브러리를 사용하는 것도 방법이 될 수 있습니다.이렇게 하면 포크+어보트(fork+abort) 기술과 유사한 결과를 얻지만 멀티 스레드 앱으로 더 잘 재생됩니다(포크 전에 모든 스레드를 잠시 정지시켜 아이를 엉망으로 만들지 않도록 합니다).

예:

#include <google/coredumper.h>...
WriteCoreDump('core.my program');/* 계속 진행해요, 우리는 핵심 파일을 만들었고,* 추락한 건 아닙니다*/

Sun에서는 Solaris, HP-UX, Redhat 및 Windows에서 코어 파일을 가져오는 방법을 설명합니다.

솔라리스에는 gcore 프로그램이 있습니다.HP-UX가 있을 수도 있습니다.그렇지 않으면 gdb와 gcore 명령을 사용합니다.Windows에 win-dbg-root\tlist가 있습니다.exe 및 win-dbg-root\adplus.vbs

코어를 원하십니까, 아니면 스택 트레이스를 원하십니까?원하는 것이 스택 트레이스라면 여기 오픈 소스를 보고 거기서 코드를 통합하거나 명령줄에서 호출하는 것만으로도 충분합니다.

gdb 프로젝트의 일부 코드도 유용할 것으로 생각합니다.

gdb를 사용하여 실행 중인 프로세스에 연결하는 것도 좋습니다.

$ gdb /path/to/exec 1234 # 1234 is the pid of the running process

코어 덤프를 생성하기 위한 소스 코드는 gdb 패키지의 일부인 'gcore'에 있습니다.

또한 태양은 gcore를 가지고 있습니다.

또한 현재 공정이 중단되어야 하므로 코어 덤프를 실행하는 별도의 공정이 있어야 합니다.자세한 내용은 gcore 소스에서 찾을 수도 있고, 프로세스를 대상으로 플랫폼의 gcore를 실행할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/131439/how-can-a-c-program-produce-a-core-dump-of-itself-without-terminating

반응형