시나리오(우분투 16.04):
C 프로그램을 컴파일하고 실행합니다( 를 사용하여 -g
Traditional 을 얻었 Segmentation Fault (core dumped)
으나 (물론) 멋진 "핵심" 파일을 찾을 수 없습니다. 일부 조사에서는 /proc/sys/kernel/core_pattern
다음 효과를 얻기 위해 명령을 사용하여 수정하라고 합니다: echo '|tee /home/me/my_core_folder/my_core_file' | sudo tee /proc/sys/kernel/core_pattern
, 그리고 이 작업을 수행한 후) , 나는 점점 더 (core dumped)
이상 이해하기 시작합니다 Segmentation Fault
. 내가 가야 할 곳으로 이동하려면 자동 완성 기능을 사용하세요.gdb ./program_object_file.out core.pid
gdb ./a.out
(gdb) core core.pid
tab
질문:
코어 덤프를 얻는 일반적인 방법이 있습니까? 나는 내가 접촉한 모든 기계에는 다음과 같은 특징이 있다는 것을 깨달았습니다.마이클 베이의 트랜스포머-esque 내가 소유한 모든 장치가 기본적으로 제대로 작동하지 않도록 하드웨어와 소프트웨어를 재구성하는 기능입니다. 내 컴퓨터는 물론 다른 사람의 컴퓨터에서도 코어 덤프를 찾을 수 있는 간단한 알고리즘/방법이 있습니까? 나는 항상 나 자신을 위해 일을 많이 한 후에 친구들에게 이와 같은 일을 가르치는 것을 발견합니다. 명령이나 무언가를 실행하여 실행 파일이 실행되는 디렉터리에 핵심 파일을 덤프할 수 있으면 좋을 것 같습니다. 좋아요 ...대부분의("일부"로 만족하겠습니다) Linux/Unix 시스템에서 이 작업을 수행할 수 있는 방법이 있습니까?
답변1
이것core(5)
맨페이지에는 이름 지정을 포함하여 코어 덤프에 영향을 미치는 매개 변수가 자세히 설명되어 있습니다.
귀하의 질문에 대답하자면, 코어 덤프를 찾는 보편적인 방법은 없습니다. 기본적으로 코어 덤프는프로세스현재 작업 디렉터리, 프로세스가 거기에 쓸 수 있는 경우, 포함하는 파일 시스템에 충분한 공간이 있는 경우, 기존 코어 덤프가 없는 경우(경우에 따라), 파일 크기 및 코어 파일 크기 제한(다음으로 결정됨) ulimit
또는 유사한 메커니즘)을 허용합니다. 그러나 /proc/sys/kernel/core_pattern
코어 덤프를 처리하는 방법은 다양하므로 실제로 이를 살펴보고 무슨 일이 일어나고 있는지 파악해야 합니다.
귀하의 경우 처음에 코어를 찾을 수 없는 이유는 알 수 없지만 파이프를 사용할 때 리디렉션: 핸들러를 설정한 후 코어 가져오기를 중단한 이유는 알고 있습니다 core_pattern
.~ 해야 하다절대 경로 이름을 사용하여 지정합니다. tee
그 자체로는 사용되지 않습니다 /usr/bin/tee
. 코어 덤프를 처리하는 프로그램은 root
.
데비안 파생물에 설치합니다corekeeper
, 사용하기 쉬운 방식으로 코어 덤프를 작성합니다 /var/crash
.
답변2
(문제의 답변을 OP에서 답변으로 이동했습니다.)
실제로 무엇이 잘못되었는지 판단하는 데 도움이 되었기 때문에 아래 답변을 정답으로 표시하고 있습니다. 나중에 이 문제를 더 구체화하기 위해 이 문제로 돌아가고 싶지만 현재 솔루션(대부분의 경우 작동할 것으로 생각됩니다) Linux 시스템) )은 다음 명령을 사용하고 있습니다.
cat /proc/sys/kernel/core_pattern > ~/.core_pattern.bak
echo '|/usr/bin/tee ~/path_you_wish_to_dump_to/core/dump' | sudo tee /proc/sys/kernel/core_pattern
.core_pattern.bak
이전 코어 덤프 방법을 홈 폴더의 숨겨진 파일( ) 에 백업합니다 . 이 파일은 다음 명령을 사용하여 복원할 수 있습니다.
sudo cp ~/.core_pattern.bak /proc/sys/kernel/core_pattern
core
두 번째 명령을 사용 하면 코어 덤프가 dump
. 그러나 내가 아는 한, 한 번에 하나의 코어 덤프만 저장된다는 점에 유의해야 합니다(새로운 덤프가 나올 때마다 이전 덤프는 파괴됨). 프로그램을 실행했고, 오래된 덤프를 보관할 필요가 없기 때문에 이것은 나와 친구들이 만들고 디버그할 대부분의 응용 프로그램에 대한 훌륭한 솔루션입니다. 세그폴트를 일으킨 PID와 같은 항목을 포함하도록 이 답변을 더 수정하고 싶은 유혹을 느낄 것입니다(주로 맨 위에는 설탕만 있습니다. 왜냐하면 방금 실행했기 때문에 일반적으로 어떤 프로그램이 세그폴트를 일으켰는지 알고 있기 때문입니다). 그러나 이것은 확실히 충분합니다. 나와 나는 많은 사람을 상상한다.
마지막으로 실제로 덤프를 보려면 다음 명령을 실행하십시오.
gdb ./executable_that_crashed ~/path_you_wish_to_dump_to/core/dump
세그먼트 오류가 발생한 실행 파일을 컴파일/실행한 폴더에 있다고 가정합니다.