코어가 덤프되었지만 코어 파일이 현재 디렉토리에 없습니까?


277

C 프로그램을 실행하는 동안 "(core dumped)"라고 표시됩니다. 되지만 현재 경로 아래에 파일이 없습니다.

나는 다음을 설정하고 확인했다 ulimit.

ulimit -c unlimited 
ulimit -a 

또한 "core"라는 파일을 찾으려고했지만 코어 덤프 파일을 얻지 못했습니까?
핵심 파일이 어디에 있습니까?


1
프로그램이 어느 시점에서 chdir을 호출합니까? 그렇다면 거기를보십시오.
William Pursell

2
프로그램이 작업 디렉토리를 변경합니까? 저길 봐.
Richard Pennington

최신 파일을 찾기 위해 전체 하드 드라이브를 검색합니다.)
Hamish Grubijan

1
죄송합니다. ..program chdir을 / mnt로 확인했으며 / 두 디렉토리를 모두 확인했지만 파일을 찾을 수 없습니다. 심지어 / * name "* core"를 찾았습니다. 이것조차도 파일을 보여주지 않았습니다. 이 프로그램은 C + sqlite를 사용하고 코어 덤프하는 값을 삽입하면서 처음으로 어설 션 error == 0이고 두 번째로 error = 101
이라고 말했습니다

7
예, /proc/sys/kernel/core_pattern시작하는 문자열로 재정의하면 /tmp코어 덤프가 진행됩니다.
ephemient

답변:


240

/usr/src/linux/Documentation/sysctl/kernel.txt를 읽으십시오 .

[/ proc / sys / kernel /] core_pattern은 코어 덤프 파일 패턴 이름을 지정하는 데 사용됩니다.

  • 패턴의 첫 문자가 '|'이면 커널은 나머지 패턴을 실행할 명령으로 처리합니다. 코어 덤프는 파일 대신 해당 프로그램의 표준 입력에 작성됩니다.

코어 덤프를 디스크에 쓰는 대신 시스템이이를 디스크로 abrt프로그램 으로 보내도록 구성되어 있습니다. 자동 버그보고 도구는 가능성 등이 문서화되지 해야 할 ...

어떤 경우에는, 빠른 응답은 당신이 당신의 코어 파일을 찾을 수 있어야한다는 것입니다 /var/cache/abrt경우, abrt호출되는 저장합니다 후를. 마찬가지로, Apport를 사용하는 다른 시스템 은에서 코어를 다람쥐로 제거 할 수 있습니다 /var/crash.


30
예, 다음 내용 echo "core. % e. % p"> / proc / sys / kernel / core_pattern .core를 사용하여 core_pattern을 편집했습니다. 현재 디렉토리 자체에 코어 덤프 파일을 만듭니다. "core.giis.12344"등의 이름으로 답변하십시오. 답변 / 의견 / 힌트에 감사드립니다.
webminal.org

20
fedora 18 abrt 프로그램이 /var/spool/abrt/대신 코어 덤프를 저장하고 있음을 주목하십시오./var/cache/abrt
Nelson

4
모든 사람이 시스템 구성을 사용하지 않고 사용자가 직접 구성 할 수있는 방법이 있습니까?
allyourcode

이 명령이 실행되고 프로세스가 호출되면 기본적으로 stdout 및 stderr이 열리지 않습니까? 나는 매우 이상한 일들이 일어나고있는 것을 본다. stderr의 dup2와 stdout을 사용자 정의 파일 (applog.txt)에 사용하면 다른 파일 (mycore.BIN)에 쓰고있는 데이터가 stdout & stderr (applog.txt)를 잡는 데 사용 된 파일로 리디렉션됩니다 . 이것에 대해 잘 읽었습니까? 제안 해주세요. 감사합니다
mk .. 7

20
systemd 아치 리눅스에서 상점에서 코어 덤프/var/lib/systemd/coredump/
프랑소와

224

최근 우분투 (필자의 경우 12.04)에서 "세그먼트 결함 (코어 덤프)"이 인쇄 될 수 있지만 로컬 파일이 컴파일 된 프로그램과 같이 예상되는 위치에 코어 파일이 생성되지 않습니다.

코어 파일 크기 ulimit가 0 인 경우 (아직 수행하지 않은 경우) 이런 상황이 발생할 수 있습니다. 이것은 ulimit -c unlimited우분투의 기본값입니다. 일반적으로 "(core dumped)"를 억제하여 실수를 저 지르지 만 우분투에서는 코어 파일이를 통해 Apport (우분투의 충돌보고 시스템)에 파이프되어 /proc/sys/kernel/core_pattern오해의 소지가있는 것으로 보입니다.

Apport가 문제의 프로그램이 충돌을보고해야하는 것이 아니라는 것을 발견하면 (에서 발생하는 것을 볼 수 있음 /var/log/apport.log) 코어 파일을 cwd에 넣는 기본 커널 동작을 시뮬레이션하는 것으로 돌아갑니다 (스크립트에서 수행됨)/usr/share/apport/apport ). 여기에는 ulimit 적용이 포함되며,이 경우 아무 것도 수행하지 않습니다. 그러나 커널에 관한 한 코어 파일이 생성되어 (분류하기 위해 파이프 됨) "세그먼트 결함 (코어 덤프)"이라는 메시지가 표시됩니다.

궁극적으로 PEBKAC는 ulimit 설정을 잊어 버렸지 만 오해의 소지가있는 메시지는 내가 코어 파일을 무엇을 먹고 있었는지 궁금해 한동안 화가 났다고 생각했습니다.

(또한 일반적으로 core (5) 매뉴얼 페이지 man 5 core--는 코어 파일이 끝나는 위치와 파일이 작성되지 않는 이유에 대한 참조입니다.)


4
정말 감사합니다. 같은 문제가 발생했습니다. Btw, Ubuntu 14.04는 설명한 것과 정확히 동일한 동작을 보여줍니다.
Malte Skoruppa

5
내 우분투에서 실행하여, 이것에 대한 쉬운 임시 해결 방법있다 (1404 수정)를 설치 sudo service apport stop나는 그것을 실행 한 후 변경할 --- /proc/sys/kernel/core_pattern단지에 apport 파이프에서 core. Apport는 core_pattern일시적으로 고칠 수있을만큼 똑똑 합니다.
Patrick Collins

6
"ulimit -c 무제한"은 정확히 내가 필요한 것입니다-감사합니다!
Dave C

4
ulimit 명령을 수행 한 후 모든 해당 답변과 모든 주석의 모든 위치를 시도했지만 여전히 Ubuntu 16.04 LTS에서 핵심 파일을 찾을 수 없습니다 ...
Nagev

2
@ElectricGoat 아니에요. UX 디자인, IMO가 좋지 않습니다. 시스템은 경로를 인쇄하거나 메시지가 작성되지 않은 경우 전혀 인쇄하지 않아야합니다. 더 자세히 조사 할 수있는 기회가있을 때 또는 나만의 답변을 추가하겠습니다.
Nagev

80

systemd 가 출시되면서 또 다른 시나리오도 있습니다. 기본적으로 systemd는 저널에 코어 덤프를 저장하며 systemd-coredumpctl명령 으로 액세스 할 수 있습니다 . core_pattern-file에 정의되어 있습니다.

$ cat /proc/sys/kernel/core_pattern 
|/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e

이 동작은 간단한 "해킹"으로 비활성화 할 수 있습니다.

$ ln -s /dev/null /etc/sysctl.d/50-coredump.conf
$ sysctl -w kernel.core_pattern=core      # or just reboot

항상 그렇듯이 코어 덤프의 크기는 예를 들어 수행되는 것처럼 덤프중인 코어의 크기와 같거나 커야합니다 ulimit -c unlimited.


그 "해킹"은 (다시 시작한 후에도) 나를 위해 작동하지 않았습니다. Arch Linux를 실행하고 있으며 이미 실행하고 ulimit -c unlimited있습니다.
gsingh2011

@ gsingh2011 구식 일 수 있습니다. 더 이상 아치를 실행하지 않으므로 요즘 작동하는지 말할 수 없습니다. 당신이 그것을 알아 내면 새로운 의견으로 저를 업데이트하십시오.
timss

5
@ gsingh2011 50-coredump.conf대신 사용해보십시오 coredump.conf. 재정의해야합니다 /lib/sysctl.d/50-coredump.conf. 기본값은 복원 할 수 있습니다sysctl -w kernel.core_pattern=core
Lekensteyn

나는 일이에 대한 appport 해제했다sudo service apport stop
rahul003

51

Ubuntu 16.04 LTS 에서 코어 덤프를 얻는 지침 작성 :

  1. @jtn이 그의 답변에서 언급했듯이 우분투는 충돌 표시를 apport에 위임합니다. 이 프로그램은 설치된 패키지가 아니기 때문에 덤프 작성을 거부합니다.변경하기 전에

  2. 이 문제를 해결하려면 apport 가 패키지아닌 프로그램에 대한 코어 덤프 파일도 작성 해야 합니다. 이렇게하려면 ~ / .config / apport / settings 라는 파일을 다음 내용으로 만듭니다 .
    [main] unpackaged=true

  3. 이제 프로그램을 다시 크래시 하고 * .1000.crash 와 같은 이름의 / var / crash 폴더 내에 크래시 파일이 생성 되는지 확인하십시오 . gdb 는이 파일들을 직접 읽을 수 없습니다 .변경 후
  4. [선택 사항] gdb가 덤프를 읽을 수있게하려면 다음 명령을 실행하십시오.

    apport-unpack <location_of_report> <target_directory>

참조 : Core_dump – Oracle VM VirtualBox


3
이것은 우분투 18.04에서 나를 위해 일한 유일한 솔루션입니다
greuze

~ /와 관련된 사용자는 누구입니까? 프로세스가 루트로 실행되면 /root/.config/apport/settings?
Nicholi

@Nicholi 나는 프로그램을 실행 한 사용자 여야한다고 생각합니다. 그래도 확실하지 않습니다.
ankurrc 2016 년

12

다음 두 가지 가능성을 생각할 수 있습니다.

  1. 다른 사람들이 이미 지적했듯이 프로그램은 chdir(). 프로그램을 실행하는 사용자가 디렉토리에 쓸 chdir()수 있습니까? 그렇지 않으면 코어 덤프를 작성할 수 없습니다.

  2. 이상한 이유로 코어 덤프의 이름이 지정되지 않았습니다 . core.*확인할 수 있습니다 /proc/sys/kernel/core_pattern. 또한 이름을 지정한 find 명령은 일반적인 코어 덤프를 찾지 못합니다. 당신은 사용해야 find / -name "*core.*"코어 덤프의 전형적인 이름 그대로,core.$PID


여기 내 패턴이 있습니다. 코어 파일의 이름이 core.pid 대신 "PID.signal.userid"와 같은 것입니까? $ cat / proc / sys / kernel / core_pattern / usr / lib / hookCCpp / var / char / abrt % p % s % u
webminal.org

9

바이너리를 RHEL사용할 때와 사용할 때 바이너리에 대한 코어 덤프가 누락 된 경우 다음 abrt을 확인하십시오./etc/abrt/abrt-action-save-package-data.conf

포함

ProcessUnpackaged = yes

이렇게하면 설치된 패키지에 포함되지 않은 바이너리 (예 : 로컬 빌드)에 대한 충돌 보고서 (코어 덤프 포함)를 만들 수 있습니다.


6

fedora25의 경우 코어 파일을 찾을 수 있습니다.

/var/spool/abrt/ccpp-2017-02-16-16:36:51-2974/coredump

여기서 ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %`이 / proc / sys / kernel / core_pattern '에 따라


5

WSL에서의 나의 노력은 실패했습니다.

Linux 용 Windows 서브 시스템 (WSL)에서 실행중인 사용자에게는 현재 누락 된 코어 덤프 파일에 대한 공개 문제가있는 것 같습니다.

의견은

이것은 우리가 알고있는 알려진 문제이며, 우리가 조사하고있는 것입니다.

Github 문제

Windows 개발자 피드백


5

Ubuntu18.04에서 코어 파일을 얻는 가장 쉬운 방법은 아래 명령을 입력하여 apport 서비스를 중지하는 것입니다.

sudo service apport stop

그런 다음 응용 프로그램을 다시 실행하면 현재 디렉토리에 덤프 파일이 생성됩니다.


3

Linux Mint 19 (Ubuntu 18 기반)를 사용하고 있습니다. coredump현재 폴더에 파일 을 갖고 싶었습니다 . 나는 두 가지 일을해야했다 :

  1. 변경 /proc/sys/kernel/core_pattern에 의해 ( # echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_pattern또는으로# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
  2. 코어 파일 크기 제한을 $ ulimit -c unlimited

그것은 이미 답변에 쓰여졌지만 간결하게 요약하기 위해 썼습니다. 흥미롭게도 한계를 변경하는 데 루트 권한이 필요하지 않았습니다 ( /ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user non- root) root는 한계를 낮출 수 있으므로 예상치 못한 의견이 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.