core(5) - wariua/manpages-ko GitHub Wiki

NAME

core - μ½”μ–΄ 덀프 파일

DESCRIPTION

μ–΄λ–€ μ‹œκ·Έλ„λ“€μ˜ κΈ°λ³Έ λ™μž‘μ€ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œμ‹œν‚€κ³  μ½”μ–΄ 덀프 파일, 즉 μ’…λ£Œ μ‹œμ μ˜ ν”„λ‘œμ„ΈμŠ€ λ©”λͺ¨λ¦¬ 이미지λ₯Ό 담은 λ””μŠ€ν¬ νŒŒμΌμ„ λ§Œλ“œλŠ” 것이닀. 디버거(κ°€λ Ή gdb(1))μ—μ„œ κ·Έ 이미지λ₯Ό μ΄μš©ν•΄μ„œ μ’…λ£Œ μ‹œμ μ˜ ν”„λ‘œκ·Έλž¨ μƒνƒœλ₯Ό 쑰사할 수 μžˆλ‹€. ν”„λ‘œμ„ΈμŠ€ μ½”μ–΄ 덀프λ₯Ό λ§Œλ“œλŠ” μ‹œκ·Έλ„ λͺ©λ‘μ€ signal(7)μ—μ„œ λ³Ό 수 μžˆλ‹€.

ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ—°μ„± RLIMIT_CORE μžμ› μ œν•œμ„ μ„€μ •ν•˜λ©΄ "μ½”μ–΄ 덀프" μ‹œκ·Έλ„μ„ λ°›μ•˜μ„ λ•Œ λ§Œλ“œλŠ” μ½”μ–΄ 덀프 파일의 크기에 μƒν•œμ„ 쀄 수 μžˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ getrlimit(2)을 보라.

μ½”μ–΄ 덀프 파일이 생기지 μ•ŠλŠ” λ‹€μ–‘ν•œ κ²½μš°λ“€μ΄ μžˆλ‹€.

  • ν”„λ‘œμ„ΈμŠ€μ—κ²Œ μ½”μ–΄ 파일 μ“°κΈ°λ₯Ό ν•  κΆŒν•œμ΄ μ—†λ‹€. (기본적으둜 μ½”μ–΄ 파일의 이름은 coreλ‚˜ core.PID이고 ν˜„μž¬ μž‘μ—… 디렉터리에 생긴닀. 이름에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ μ•„λž˜ μ°Έκ³ .) νŒŒμΌμ„ 생성할 디렉터리에 μ“°κΈ°κ°€ κ°€λŠ₯ν•˜μ§€ μ•Šκ±°λ‚˜, 같은 μ΄λ¦„μ˜ 파일이 μ‘΄μž¬ν•˜λŠ”λ° κ·Έ 파일이 μ“°κΈ° κ°€λŠ₯ν•˜μ§€ μ•Šκ±°λ‚˜ μ •κ·œ 파일이 μ•„λ‹ˆλ©΄ (κ°€λ Ή λ””λ ‰ν„°λ¦¬λ‚˜ 심볼릭 링크이면) μ½”μ–΄ 파일 μ“°κΈ°κ°€ μ‹€νŒ¨ν•œλ‹€.

  • μ½”μ–΄ λ€ν”„λ‘œ μ‚¬μš©ν•  이름을 κ°€μ§„ (μ“°κΈ° κ°€λŠ₯ν•œ μ •κ·œ) 파일이 이미 μ‘΄μž¬ν•˜λŠ”λ° κ·Έ νŒŒμΌμ— λŒ€ν•œ ν•˜λ“œ 링크가 μ—¬λŸ¬ κ°œμ΄λ‹€.

  • μ½”μ–΄ 덀프 νŒŒμΌμ„ 생성할 파일 μ‹œμŠ€ν…œμ΄ 가득 μ°¨ μžˆκ±°λ‚˜, μ•„μ΄λ…Έλ“œκ°€ 남아 μžˆμ§€ μ•Šκ±°λ‚˜, 읽기 μ „μš©μœΌλ‘œ 마운트 돼 μžˆκ±°λ‚˜, μ‚¬μš©μžλ³„ ν• λ‹Ή μš©λŸ‰μ„ λ‹€ 썼닀.

  • μ½”μ–΄ 덀프 νŒŒμΌμ„ 생성할 디렉터리가 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

  • ν”„λ‘œμ„ΈμŠ€μ˜ RLIMIT_CORE(μ½”μ–΄ 파일 크기) λ˜λŠ” RLIMIT_FSIZE(파일 크기) μžμ› μ œν•œκ°’μ΄ 0으둜 섀정돼 μžˆλ‹€. getrlimit(2) 및 μ…Έμ˜ ulimit λͺ…λ Ή (csh(1)μ—μ„œλŠ” limit) μ„€λͺ… μ°Έκ³ .

  • ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰ 쀑인 λ°”μ΄λ„ˆλ¦¬μ— 읽기 κΆŒν•œμ΄ 켜져 μžˆμ§€ μ•Šλ‹€.

  • ν”„λ‘œμ„ΈμŠ€κ°€ set-user-ID(set-group-ID) ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ 쀑인데 ν”„λ‘œκ·Έλž¨ μ†Œμœ  μ‚¬μš©μž(κ·Έλ£Ή)κ°€ ν”„λ‘œμ„ΈμŠ€μ˜ μ‹€μ œ μ‚¬μš©μž(κ·Έλ£Ή) ID와 λ‹€λ₯΄κ±°λ‚˜, ν”„λ‘œμ„ΈμŠ€κ°€ 파일 μ—­λŠ₯(capabilities(7) μ°Έκ³ )을 κ°€μ§„ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ 쀑이닀. (ν•˜μ§€λ§Œ prctl(2) PR_SET_DUMPABLE λ™μž‘ μ„€λͺ…κ³Ό proc(5)의 /proc/sys/fs/suid_dumpable μ„€λͺ…도 λ³Ό 것.)

  • /proc/sys/kernel/core_pattern이 λΉ„μ–΄ 있고 /proc/sys/kernel/core_uses_pid 값이 0이닀. (이 νŒŒμΌλ“€μ€ μ•„λž˜μ—μ„œ μ„€λͺ…ν•œλ‹€.) 참고둜 /proc/sys/kernel/core_pattern이 λΉ„μ–΄ 있고 /proc/sys/kernel/core_uses_pid 값이 1이면 μ½”μ–΄ 덀프 파일 이름이 .PID ν˜•νƒœκ°€ 되고, κ·Έλž˜μ„œ ls(1) -a μ˜΅μ…˜μ„ μ“°μ§€ μ•ŠμœΌλ©΄ 보이지 μ•ŠλŠ”λ‹€.

  • (λ¦¬λˆ…μŠ€ 3.7λΆ€ν„°) CONFIG_COREDUMPλ₯Ό λΉΌκ³  컀널을 κ΅¬μ„±ν–ˆλ‹€.

그리고 madvise(2)의 MADV_DONTDUMP ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν–ˆλ‹€λ©΄ ν”„λ‘œμ„ΈμŠ€ μ£Όμ†Œ 곡간 쀑 일뢀가 μ½”μ–΄ λ€ν”„μ—μ„œ μ œμ™Έλ  수 μžˆλ‹€.

init ν”„λ ˆμž„μ›Œν¬λ‘œ systemd(1)λ₯Ό μ“°λŠ” μ‹œμŠ€ν…œμ—μ„œλŠ” μ½”μ–΄ 덀프 μœ„μΉ˜λ₯Ό systemd(1)κ°€ κ²°μ •ν•  수 μžˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ μ•„λž˜ μ°Έκ³ .

μ½”μ–΄ 덀프 파일 이름

기본적으둜 μ½”μ–΄ 덀프 파일의 이름은 coreμ§€λ§Œ (λ¦¬λˆ…μŠ€ 2.6 및 2.4.21λΆ€ν„°λŠ”) /proc/sys/kernel/core_pattern νŒŒμΌμ„ 톡해 μ½”μ–΄ 덀프 파일의 이름 ν˜•μ‹μ„ μ„€μ •ν•  수 μžˆλ‹€. ν˜•μ‹μ— % μ§€μ‹œμžκ°€ λ“€μ–΄κ°ˆ 수 있으며 μ½”μ–΄ 파일 생성 μ‹œ λ‹€μŒ κ°’λ“€λ‘œ 바뀐닀.

%% % 문자
%c μ£½λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μ½”μ–΄ 파일 크기 μ—°μ„± μžμ› μ œν•œ (λ¦¬λˆ…μŠ€ 2.6.24λΆ€ν„°)
%d 덀프 λͺ¨λ“œ. prctl(2) PR_GET_DUMPABLE이 λ°˜ν™˜ν•˜λŠ” κ°’κ³Ό κ°™μŒ. (λ¦¬λˆ…μŠ€ 3.7λΆ€ν„°)
%e μ‹€ν–‰ 파일 이름. 경둜 선두뢀 μ œμ™Έ.
%E μ‹€ν–‰ 파일 이름. μŠ¬λž˜μ‹œ('/')λ₯Ό λŠλ‚Œν‘œ('!')둜 λ°”κΏ”μ„œ. (λ¦¬λˆ…μŠ€ 3.0λΆ€ν„°)
%g 덀프 λŒ€μƒ ν”„λ‘œμ„ΈμŠ€μ˜ (숫자둜 된) μ‹€μ œ GID
%h 호슀트λͺ…. uname(2)이 λ°˜ν™˜ν•˜λŠ” nodenameκ³Ό κ°™μŒ.
%i μ½”μ–΄ 덀프λ₯Ό μœ λ°œν•œ μŠ€λ ˆλ“œμ˜ TID. μŠ€λ ˆλ“œκ°€ μœ„μΉ˜ν•œ PID λ„€μž„μŠ€νŽ˜μ΄μŠ€ κΈ°μ€€. (λ¦¬λˆ…μŠ€ 3.18λΆ€ν„°)
%I μ½”μ–΄ 덀프λ₯Ό μœ λ°œν•œ μŠ€λ ˆλ“œμ˜ TID. 졜초 PID λ„€μž„μŠ€νŽ˜μ΄μŠ€ κΈ°μ€€. (λ¦¬λˆ…μŠ€ 3.18λΆ€ν„°)
%p 덀프 λŒ€μƒ ν”„λ‘œμ„ΈμŠ€μ˜ PID. ν”„λ‘œμ„ΈμŠ€κ°€ μœ„μΉ˜ν•œ PID λ„€μž„μŠ€νŽ˜μ΄μŠ€ κΈ°μ€€.
%P 덀프 λŒ€μƒ ν”„λ‘œμ„ΈμŠ€μ˜ PID. 졜초 PID λ„€μž„μŠ€νŽ˜μ΄μŠ€ κΈ°μ€€. (λ¦¬λˆ…μŠ€ 3.12λΆ€ν„°)
%s 덀프λ₯Ό μΌμœΌν‚¨ μ‹œκ·Έλ„μ˜ 번호
%t 덀프 μ‹œκ°„. 에포크, 즉 1970-01-01 00:00:00 +0000 (UTC) 이후 κ²½κ³Όν•œ 초의 수둜 ν‘œν˜„.
%u 덀프 λŒ€μƒ ν”„λ‘œμ„ΈμŠ€μ˜ (숫자둜 된) μ‹€μ œ UID

ν˜•μ‹ 끝에 %κ°€ ν•œ 개만 있으면 μ½”μ–΄ 파일 μ΄λ¦„μ—μ„œ λΉ μ§„λ‹€. % 뒀에 μœ„μ— λ‚˜μ—΄λœ 것 μ™Έμ˜ λ¬Έμžκ°€ μ‘°ν•©λœ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€λ‹€. κ·Έ μ™Έμ˜ λ‹€λ₯Έ λ¬Έμžλ“€μ€ λͺ¨λ‘ μ½”μ–΄ 파일 이름에 κ·ΈλŒ€λ‘œ λ“€μ–΄κ°„λ‹€. ν˜•μ‹μ— '/' λ¬Έμžκ°€ 포함될 수 있으며 디렉터리 이름 κ΅¬λΆ„μžλ‘œ ν•΄μ„ν•œλ‹€. 결과둜 λ‚˜μ˜€λŠ” μ½”μ–΄ 파일 μ΄λ¦„μ˜ μ΅œλŒ€ κΈΈμ΄λŠ” 128λ°”μ΄νŠΈμ΄λ‹€. (2.6.19 μ „μ˜ μ»€λ„μ—μ„œλŠ” 64λ°”μ΄νŠΈμ˜€λ‹€.) 이 파일의 κΈ°λ³Έ 값은 "core"이닀. ν•˜μœ„ ν˜Έν™˜μ„±μ„ μœ„ν•΄μ„œ /proc/sys/kernel/core_pattern에 %pκ°€ μ—†κ³  /proc/sys/kernel/core_uses_pid(μ•„λž˜ μ°Έκ³ )κ°€ 0이 μ•„λ‹ˆλ©΄ μ½”μ–΄ 파일 이름에 .PIDλ₯Ό 덧뢙인닀.

경둜 해석은 μ£½λŠ” ν”„λ‘œμ„ΈμŠ€μ—μ„œ ν™œμ„±μΈ 섀정듀에 따라 이뀄진닀. μ„€μ •μ΄λž€ μ£½λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€(mount_namespaces(7) μ°Έκ³ ), (getcwd(2)λ₯Ό 톡해 얻은) ν˜„μž¬ μž‘μ—… 디렉터리, 루트 디렉터리(chroot(2) μ°Έκ³ )이닀.

버전 2.4λΆ€ν„° λ¦¬λˆ…μŠ€μ—μ„œλŠ” μ½”μ–΄ 덀프 파일 이름을 μ œμ–΄ν•˜λŠ” 더 λ‹¨μˆœν•œ 방법을 ν•¨κ»˜ μ œκ³΅ν–ˆλ‹€. /proc/sys/kernel/core_uses_pid νŒŒμΌμ— 0 값이 λ“€μ–΄ 있으면 μ½”μ–΄ 덀프 파일의 이름이 κ·Έλƒ₯ core이닀. κ·Έ νŒŒμΌμ— 0 μ•„λ‹Œ 값이 λ“€μ–΄ 있으면 μ½”μ–΄ 덀프 파일 이름에 ν”„λ‘œμ„ΈμŠ€ IDκ°€ ν¬ν•¨λ˜μ–΄ core.PID ν˜•νƒœκ°€ λœλ‹€.

λ¦¬λˆ…μŠ€ 3.6λΆ€ν„°λŠ” /proc/sys/fs/suid_dumpable을 2("suidsafe")둜 μ„€μ •ν•˜λŠ” 경우 νŒ¨ν„΄μ΄ ('/' 문자둜 μ‹œμž‘ν•˜λŠ”) μ ˆλŒ€ 경둜λͺ…μ΄κ±°λ‚˜ μ•„λž˜ μ„€λͺ…ν•˜λŠ” νŒŒμ΄ν”„μ—¬μ•Ό ν•œλ‹€.

νŒŒμ΄ν”„λ‘œ μ½”μ–΄ 덀프λ₯Ό ν”„λ‘œκ·Έλž¨μœΌλ‘œ 보내기

λ¦¬λˆ…μŠ€ 컀널 2.6.19λΆ€ν„° /proc/sys/kernel/core_pattern νŒŒμΌμ—μ„œ 또 λ‹€λ₯Έ 문법을 μ§€μ›ν•œλ‹€. 파일의 첫 번째 λ¬Έμžκ°€ νŒŒμ΄ν”„ 기호(|)이면 ν–‰ λ‚˜λ¨Έμ§€λ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ” μ‚¬μš©μž 곡간 ν”„λ‘œκ·Έλž¨ (λ‚΄μ§€ 슀크립트) λͺ…λ Ήν–‰μœΌλ‘œ ν•΄μ„ν•œλ‹€. μ½”μ–΄ λ€ν”„λŠ” λ””μŠ€ν¬ νŒŒμΌμ— κΈ°λ‘λ˜μ§€ μ•Šκ³  κ·Έ ν”„λ‘œκ·Έλž¨μ— ν‘œμ€€ μž…λ ₯으둜 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ 사항에 μœ μ˜ν•΄μ•Ό ν•œλ‹€.

  • μ ˆλŒ€ 경둜λͺ…μœΌλ‘œ (λ˜λŠ” 루트 디렉터리 / κΈ°μ€€ 경둜λͺ…μœΌλ‘œ) ν”„λ‘œκ·Έλž¨μ„ μ§€μ •ν•΄μ•Ό ν•˜λ©° '|' 문자 λ°”λ‘œ λ‹€μŒμ— 경둜λͺ…이 와야 ν•œλ‹€.

  • λͺ…λ Ήν–‰ μΈμžμ— μœ„μ— λ‚˜μ—΄ν•œ % μ§€μ‹œμžκ°€ 뭐든 λ“€μ–΄κ°ˆ 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ 덀프 쀑인 ν”„λ‘œμ„ΈμŠ€μ˜ PIDλ₯Ό μ „λ‹¬ν•˜λ €λ©΄ μΈμžμ— %pλ₯Ό μ§€μ •ν•˜λ©΄ λœλ‹€.

  • κ·Έ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ μƒμ„±λ˜λŠ” ν”„λ‘œμ„ΈμŠ€λŠ” μ‚¬μš©μžμ™€ 그룹을 root둜 ν•΄μ„œ λˆλ‹€.

  • root둜 λˆλ‹€κ³  해도 μ–΄λ–€ μ˜ˆμ™Έμ μΈ λ³΄μ•ˆ μš°νšŒλ„ 이뀄지지 μ•ŠλŠ”λ‹€. 즉 LSM(κ°€λ Ή SELinux)이 μ—¬μ „νžˆ 효λ ₯이 있으며, κ·Έλž˜μ„œ ν•Έλ“€λŸ¬μ—μ„œ /proc/[pid]λ₯Ό 톡해 죽은 ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•œ μžμ„Έν•œ 정보에 μ ‘κ·Όν•˜λŠ” κ±Έ 막을 μˆ˜λ„ μžˆλ‹€.

  • 항상 졜초 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— κ±°κΈ°λ₯Ό κΈ°μ€€μœΌλ‘œ ν”„λ‘œκ·Έλž¨ 경둜λͺ…을 ν•΄μ„ν•œλ‹€. μ£½λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μ„€μ •λ“€(κ°€λ Ή 루트 디렉터리, 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€, ν˜„μž¬ μž‘μ—… 디렉터리)에 영ν–₯을 λ°›μ§€ μ•ŠλŠ”λ‹€.

  • μ£½λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ μ•„λ‹ˆλΌ (PID, 마운트, μ‚¬μš©μž λ“±μ˜) 졜초 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ λˆλ‹€. %P 같은 μ§€μ‹œμžλ₯Ό μ΄μš©ν•˜λ©΄ μ˜¬λ°”λ₯Έ /proc/[pid] 디렉터리λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆμœΌλ―€λ‘œ ν•„μš” μ‹œ μ£½λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μ§„μž…ν•˜κ±°λ‚˜ 쑰사할 수 μžˆλ‹€.

  • 루트 디렉터리λ₯Ό ν˜„μž¬ μž‘μ—… λ””λ ‰ν„°λ¦¬λ‘œ ν•΄μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ μ‹œμž‘ν•œλ‹€. μ›ν•œλ‹€λ©΄ %P μ§€μ‹œμžκ°€ μ œκ³΅ν•œ 값을 μ΄μš©ν•΄μ„œ /proc/[pid]/cwdλ₯Ό 톡해 덀프 쀑인 ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—… λ””λ ‰ν„°λ¦¬λ‘œ λ°”κΎΈλŠ” 게 κ°€λŠ₯ν•˜λ‹€.

  • (λ¦¬λˆ…μŠ€ 2.6.24λΆ€ν„°) 곡백으둜 κ΅¬λΆ„λœ λͺ…λ Ήν–‰ μΈμžλ“€μ„ (ν–‰μ˜ 총 길이 128λ°”μ΄νŠΈκΉŒμ§€) ν”„λ‘œκ·Έλž¨μ— 쀄 수 μžˆλ‹€.

  • 이 λ©”μ»€λ‹ˆμ¦˜μ„ 톡해 ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ „λ‹¬λ˜λŠ” μ½”μ–΄ λ€ν”„μ—λŠ” RLIMIT_CORE μ œν•œμ΄ μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€.

/proc/sys/kernel/core_pipe_limit

μ‚¬μš©μž 곡간 ν”„λ‘œκ·Έλž¨μœΌλ‘œ νŒŒμ΄ν”„ ν•΄μ„œ μ½”μ–΄ 덀프λ₯Ό μˆ˜μ§‘ν•  λ•Œ μ£½λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ /proc/[pid] λ””λ ‰ν„°λ¦¬λ‘œλΆ€ν„° μ–»λŠ” 데이터가 μˆ˜μ§‘ ν”„λ‘œκ·Έλž¨μ—κ²Œ μœ μš©ν•  수 μžˆλ‹€. μ•ˆμ „ν•˜κ²Œ μˆ˜μ§‘μ„ ν•  수 있으렀면 μ½”μ–΄ 덀프 μˆ˜μ§‘ ν”„λ‘œκ·Έλž¨μ΄ 끝날 λ•ŒκΉŒμ§€ 컀널이 λŒ€κΈ°ν•˜κ²Œ ν•΄μ„œ μ£½λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ /proc/[pid] νŒŒμΌλ“€μ„ λ•Œ 이λ₯΄κ²Œ μ—†μ• μ§€ μ•Šλ„λ‘ ν•΄μ•Ό ν•œλ‹€. 그런데 μ΄λ ‡κ²Œ ν•˜λ©΄ μ˜€λ™μž‘ν•˜λŠ” μˆ˜μ§‘ ν”„λ‘œκ·Έλž¨μ΄ μ ˆλŒ€ λλ‚˜μ§€ μ•Šμ•„μ„œ 죽은 ν”„λ‘œμ„ΈμŠ€ 정리λ₯Ό λ§‰κ²Œ 될 κ°€λŠ₯성이 생긴닀.

λ¦¬λˆ…μŠ€ 2.6.32λΆ€ν„°λŠ” /proc/sys/kernel/core_pipe_limit을 μ‚¬μš©ν•΄ 그런 κ°€λŠ₯성에 λŒ€λΉ„ν•  수 μžˆλ‹€. 이 파일의 값은 λ™μ‹œμ— μ–Όλ§ˆλ‚˜ λ§Žμ€ μ£½λŠ” ν”„λ‘œμ„ΈμŠ€λ“€μ΄ λ³‘λ ¬λ‘œ μ‚¬μš©μž 곡간 ν”„λ‘œκ·Έλž¨μœΌλ‘œ νŒŒμ΄ν”„ 될 수 μžˆλŠ”μ§€ κ·œμ •ν•œλ‹€. 이 값을 μ΄ˆκ³Όν•˜λŠ” 경우 κ·Έ κ°’ μœ„μ—μ„œ μ£½λŠ” ν”„λ‘œμ„ΈμŠ€λ“€μ€ 컀널 λ‘œκ·Έμ—λ§Œ κΈ°λ‘ν•˜κ³  μ½”μ–΄ 덀프λ₯Ό κ±΄λ„ˆλ›΄λ‹€.

이 νŒŒμΌμ—μ„œ 0 값은 νŠΉλ³„ν•˜λ‹€. ν”„λ‘œμ„ΈμŠ€λ“€μ„ λ™μ‹œμ— μ œν•œ 없이 작고 μžˆμ„ 수 μžˆμŒμ„ λ‚˜νƒ€λ‚΄λ©°, λ˜ν•œ λŒ€κΈ°κ°€ 이뀄지지 μ•ŠμŒμ„ (즉 μˆ˜μ§‘ ν”„λ‘œκ·Έλž¨μ—μ„œ μ£½λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ /proc/[pid]에 μ ‘κ·Όν•˜μ§€ λͺ»ν•  μˆ˜λ„ μžˆμŒμ„) λ‚˜νƒ€λ‚Έλ‹€. 이 파일의 κΈ°λ³Έ 값은 0이닀.

μ½”μ–΄ 덀프에 기둝할 λ§€ν•‘ μ œμ–΄

컀널 2.6.23λΆ€ν„°λŠ” λ¦¬λˆ…μŠ€ μ „μš©μΈ /proc/[pid]/coredump_filter νŒŒμΌμ„ μ‚¬μš©ν•΄μ„œ ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€ IDλ₯Ό κ°€μ§„ ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•΄ μ½”μ–΄ 덀프λ₯Ό μˆ˜ν–‰ν•˜λŠ” 경우 μ½”μ–΄ 덀프 νŒŒμΌμ— μ–΄λ–€ λ©”λͺ¨λ¦¬ μ„Έκ·Έλ¨ΌνŠΈλ“€μ΄ κΈ°λ‘λ˜λ„λ‘ ν• μ§€ μ œμ–΄ν•  수 μžˆλ‹€.

파일의 값은 λ©”λͺ¨λ¦¬ λ§€ν•‘ μ’…λ₯˜λ“€(mmap(2) μ°Έκ³ )의 λΉ„νŠΈ λ§ˆμŠ€ν¬μ΄λ‹€. 마슀크의 μ–΄λ–€ λΉ„νŠΈκ°€ 섀정돼 있으면 λŒ€μ‘ν•˜λŠ” μ’…λ₯˜μ˜ λ©”λͺ¨λ¦¬ 맀핑듀을 덀프 ν•˜κ³ , μ•„λ‹ˆλ©΄ 덀프 ν•˜μ§€ μ•ŠλŠ”λ‹€. λΉ„νŠΈλ“€μ˜ μ˜λ―ΈλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

0번 λΉ„νŠΈ 읡λͺ… λΉ„κ³΅μœ  λ§€ν•‘ 덀프.
1번 λΉ„νŠΈ 읡λͺ… 곡유 λ§€ν•‘ 덀프.
2번 λΉ„νŠΈ 파일 기반 λΉ„κ³΅μœ  λ§€ν•‘ 덀프.
3번 λΉ„νŠΈ 파일 기반 곡유 λ§€ν•‘ 덀프.
4번 λΉ„νŠΈ (λ¦¬λˆ…μŠ€ 2.6.24λΆ€ν„°) ELF 헀더 덀프.
5번 λΉ„νŠΈ (λ¦¬λˆ…μŠ€ 2.6.28λΆ€ν„°) λΉ„κ³΅μœ  κ±°λŒ€ νŽ˜μ΄μ§€ 덀프.
6번 λΉ„νŠΈ (λ¦¬λˆ…μŠ€ 2.6.28λΆ€ν„°) 곡유 κ±°λŒ€ νŽ˜μ΄μ§€ 덀프.
7번 λΉ„νŠΈ (λ¦¬λˆ…μŠ€ 4.4λΆ€ν„°) λΉ„κ³΅μœ  DAX νŽ˜μ΄μ§€ 덀프.
8번 λΉ„νŠΈ (λ¦¬λˆ…μŠ€ 4.4λΆ€ν„°) 곡유 DAX νŽ˜μ΄μ§€ 덀프.

기본적으둜 0번, 1번, 4번 (CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS 컀널 ꡬ성 μ˜΅μ…˜μ΄ μΌœμ§„ 경우), 5번 λΉ„νŠΈκ°€ 섀정돼 μžˆλ‹€. coredump_filter λΆ€νŒ… μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ λΆ€νŒ… λ•Œ 이 κΈ°λ³Έ 값을 λ°”κΏ€ 수 μžˆλ‹€.

이 파일의 값은 16μ§„μˆ˜λ‘œ ν‘œμ‹œλœλ‹€. (λ”°λΌμ„œ κΈ°λ³Έ 값은 33으둜 ν‘œμ‹œλœλ‹€.)

coredump_filter 값이 μ–΄λ–»λ“ μ§€ ν”„λ ˆμž„ 버퍼 같은 λ©”λͺ¨λ¦¬ λ§΅ I/O νŽ˜μ΄μ§€λ“€μ€ μ ˆλŒ€ 덀프 ν•˜μ§€ μ•ŠμœΌλ©° 가상 DSO(vdso(7)) νŽ˜μ΄μ§€λ“€μ€ 항상 덀프 ν•œλ‹€.

fork(2)λ₯Ό 톡해 μƒμ„±λœ μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” λΆ€λͺ¨μ˜ coredump_filter 값을 λ¬Όλ €λ°›λŠ”λ‹€. execve(2)λ₯Ό κ±°μΉ˜λ©΄μ„œ coredump_filter 값이 λ³΄μ‘΄λœλ‹€.

ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 전에 λΆ€λͺ¨ μ…Έμ—μ„œ coredump_filterλ₯Ό μ„€μ •ν•˜λŠ” 게 μœ μš©ν•  수 μžˆλ‹€.

$ echo 0x7 > /proc/self/coredump_filter
$ ./some_program

컀널을 CONFIG_ELF_CORE ꡬ성 μ˜΅μ…˜μœΌλ‘œ λΉŒλ“œ ν•œ κ²½μš°μ—λ§Œ 이 파일이 μ œκ³΅λœλ‹€.

μ½”μ–΄ 덀프와 systemd

systemd(1) init ν”„λ ˆμž„μ›Œν¬λ₯Ό μ“°λŠ” μ‹œμŠ€ν…œμ—μ„œλŠ” μ½”μ–΄ 덀프가 μ €μž₯λ˜λŠ” μœ„μΉ˜λ₯Ό systemd(1)μ—μ„œ κ²°μ •ν•  수 μžˆλ‹€. 이λ₯Ό μœ„ν•΄ systemd(1)μ—μ„œλŠ” νŒŒμ΄ν”„λ‘œ μ½”μ–΄ 덀프λ₯Ό ν”„λ‘œκ·Έλž¨μœΌλ‘œ 보낼 수 μžˆλŠ” core_pattern κΈ°λŠ₯을 μ΄μš©ν•œλ‹€. μ½”μ–΄ 덀프가 νŒŒμ΄ν”„λ₯Ό 톡해 systemd-coredump(8) ν”„λ‘œκ·Έλž¨μœΌλ‘œ κ°€κ³  μžˆλŠ”μ§€ λ‹€μŒκ³Ό 같이 확인해 λ³Ό 수 μžˆλ‹€.

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

이 경우 μ½”μ–΄ λ€ν”„λŠ” systemd-coredump(8)에 μ„€μ •λœ μœ„μΉ˜λ‘œ κ°€κ²Œ λ˜λŠ”λ°, 보톡은 디렉터리 /var/lib/systemd/coredump/ μ•ˆμ— lz4(1) μ••μΆ• 파일둜 μ €μž₯λœλ‹€. systemd-coredump(8)κ°€ κΈ°λ‘ν•œ μ½”μ–΄ λ€ν”„λ“€μ˜ λͺ©λ‘μ„ coredumpctl(1)을 μ΄μš©ν•΄ λ³Ό 수 μžˆλ‹€.

$ coredumpctl list | tail -5
Wed 2017-10-11 22:25:30 CEST  2748 1000 1000 3 present  /usr/bin/sleep
Thu 2017-10-12 06:29:10 CEST  2716 1000 1000 3 present  /usr/bin/sleep
Thu 2017-10-12 06:30:50 CEST  2767 1000 1000 3 present  /usr/bin/sleep
Thu 2017-10-12 06:37:40 CEST  2918 1000 1000 3 present  /usr/bin/cat
Thu 2017-10-12 08:13:07 CEST  2955 1000 1000 3 present  /usr/bin/cat

μ½”μ–΄ λ€ν”„λ§ˆλ‹€ 덀프 μΌμ‹œ, 덀프 ν”„λ‘œμ„ΈμŠ€μ˜ PID, UID, GID, μ½”μ–΄ 덀프λ₯Ό μœ λ°œν•œ μ‹œκ·Έλ„ 번호, 덀프 된 ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰ν•˜κ³  있던 μ‹€ν–‰ 파일 경둜λͺ… λ“±μ˜ 정보가 보인닀. coredumpctl(1)의 μ—¬λŸ¬ μ˜΅μ…˜λ“€μ„ 톡해 μ§€μ •ν•œ μ½”μ–΄ 덀프 νŒŒμΌμ„ systemd(1) μœ„μΉ˜μ—μ„œ μ§€μ •ν•œ 파일둜 κ°€μ Έμ˜¬ 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ μœ„μ— μžˆλŠ” PID 2955의 μ½”μ–΄ 덀프λ₯Ό ν˜„μž¬ 디렉터리에 coreλΌλŠ” 파일둜 λΉΌλ‚΄λ €λ©΄ λ‹€μŒκ³Ό 같이 ν•˜λ©΄ λœλ‹€.

$ coredumpctl dump 2955 -o core

더 μžμ„Έν•œ λ‚΄μš©μ€ coredumpctl(1) 맀뉴얼 νŽ˜μ΄μ§€λ₯Ό μ°Έκ³ ν•˜λΌ.

systemd(1)의 μ½”μ–΄ 덀프 기둝 λ©”μ»€λ‹ˆμ¦˜μ„ 끄고 전톡적인 λ¦¬λˆ…μŠ€ λ™μž‘ 방식을 λ³΅μ›ν•˜κ³  μ‹Άλ‹€λ©΄ λ‹€μŒμ²˜λŸΌ systemd(1) λ©”μ»€λ‹ˆμ¦˜μ„ λ¬΄μ‹œν•˜κ²Œ μ„€μ •ν•  수 μžˆλ‹€.

# echo "kernel.core_pattern=core.%p" > /etc/sysctl.d/50-coredump.conf
# /lib/systemd/systemd-sysctl

NOTES

gdb(1)의 gcore λͺ…령을 μ΄μš©ν•˜λ©΄ μ‹€ν–‰ 쀑인 ν”„λ‘œμ„ΈμŠ€μ˜ μ½”μ–΄ 덀프λ₯Ό 얻을 수 μžˆλ‹€.

λ¦¬λˆ…μŠ€ 2.6.27κΉŒμ§€μ˜ λ²„μ „μ—μ„œλŠ” 닀쀑 μŠ€λ ˆλ“œ ν”„λ‘œμ„ΈμŠ€κ°€ (더 μ •ν™•νžˆλŠ” clone(2)의 CLONE_VM ν”Œλž˜κ·Έλ‘œ μƒμ„±λΌμ„œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€κ°€) μ½”μ–΄λ₯Ό 덀프 ν•˜λŠ” κ²½μš°μ— /proc/sys/kernel/core_pattern의 %p μ§€μ‹œμžλ₯Ό 톡해 파일λͺ… μ–΄λ”˜κ°€μ— 이미 ν”„λ‘œμ„ΈμŠ€ IDκ°€ 포함돼 μžˆμ§€ μ•ŠμœΌλ©΄ 항상 μ½”μ–΄ 파일λͺ…에 ν”„λ‘œμ„ΈμŠ€ IDλ₯Ό 덧뢙인닀. (ν”„λ‘œμ„ΈμŠ€μ˜ μŠ€λ ˆλ“œλ§ˆλ‹€ PIDκ°€ λ‹€λ₯Έ ꡬ식 LinuxThreads κ΅¬ν˜„μ„ μ“Έ λ•Œ 주둜 도움이 λœλ‹€.)

EXAMPLE

μ•„λž˜ ν”„λ‘œκ·Έλž¨μ„ 톡해 /proc/sys/kernel/core_pattern 파일의 νŒŒμ΄ν”„ 문법 μ‚¬μš© 방식을 λ³Ό 수 μžˆλ‹€. λ‹€μŒ μ…Έ μ„Έμ…˜μ€ 이 ν”„λ‘œκ·Έλž¨ μ‚¬μš©λ‘€λ₯Ό 보여 μ€€λ‹€. (core_pattern_pipe_testλΌλŠ” μ‹€ν–‰ 파일둜 컴파일 함.)

$ cc -o core_pattern_pipe_test core_pattern_pipe_test.c
$ su
Password:
# echo "|$PWD/core_pattern_pipe_test %p UID=%u GID=%g sig=%s" > \
    /proc/sys/kernel/core_pattern
# exit
$ sleep 100
^\                     # Ctrl-\ μž…λ ₯
Quit (core dumped)
$ cat core.info
argc=5
argc[0]=</home/mtk/core_pattern_pipe_test>
argc[1]=<20575>
argc[2]=<UID=1000>
argc[3]=<GID=100>
argc[4]=<sig=3>
Total bytes in core dump: 282624

ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€

/* core_pattern_pipe_test.c */

#define _GNU_SOURCE
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define BUF_SIZE 1024

int
main(int argc, char *argv[])
{
    int tot, j;
    ssize_t nread;
    char buf[BUF_SIZE];
    FILE *fp;
    char cwd[PATH_MAX];

    /* 죽은 ν”„λ‘œμ„ΈμŠ€μ˜ ν˜„μž¬ μž‘μ—… λ””λ ‰ν„°λ¦¬λ‘œ 이동 */

    snprintf(cwd, PATH_MAX, "/proc/%s/cwd", argv[1]);
    chdir(cwd);

    /* κ·Έ λ””λ ‰ν„°λ¦¬μ˜ 파일 "core.info"둜 기둝 */

    fp = fopen("core.info", "w+");
    if (fp == NULL)
        exit(EXIT_FAILURE);

    /* core_pattern νŒŒμ΄ν”„ ν”„λ‘œκ·Έλž¨μ΄ 받은 λͺ…λ Ήν–‰ 인자 ν‘œμ‹œ */

    fprintf(fp, "argc=%d\n", argc);
    for (j = 0; j < argc; j++)
        fprintf(fp, "argc[%d]=<%s>\n", j, argv[j]);

    /* ν‘œμ€€ μž…λ ₯(μ½”μ–΄ 덀프)의 λ°”μ΄νŠΈ 수 μ„ΈκΈ° */

    tot = 0;
    while ((nread = read(STDIN_FILENO, buf, BUF_SIZE)) > 0)
        tot += nread;
    fprintf(fp, "Total bytes in core dump: %d\n", tot);

    fclose(fp);
    exit(EXIT_SUCCESS);
}

SEE ALSO

bash(1), coredumpctl(1), gdb(1), getrlimit(2), mmap(2), prctl(2), sigaction(2), elf(5), proc(5), pthreads(7), signal(7), systemd-coredump(8)


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️