core(5) - wariua/manpages-ko GitHub Wiki
core - μ½μ΄ λ€ν νμΌ
μ΄λ€ μκ·Έλλ€μ κΈ°λ³Έ λμμ νλ‘μΈμ€λ₯Ό μ’ λ£μν€κ³ μ½μ΄ λ€ν νμΌ, μ¦ μ’ λ£ μμ μ νλ‘μΈμ€ λ©λͺ¨λ¦¬ μ΄λ―Έμ§λ₯Ό λ΄μ λμ€ν¬ νμΌμ λ§λλ κ²μ΄λ€. λλ²κ±°(κ°λ Ή 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/[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(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
gdb(1)μ gcore
λͺ
λ Ήμ μ΄μ©νλ©΄ μ€ν μ€μΈ νλ‘μΈμ€μ μ½μ΄ λ€νλ₯Ό μ»μ μ μλ€.
리λ
μ€ 2.6.27κΉμ§μ λ²μ μμλ λ€μ€ μ€λ λ νλ‘μΈμ€κ° (λ μ ννλ clone(2)μ CLONE_VM
νλκ·Έλ‘ μμ±λΌμ λ€λ₯Έ νλ‘μΈμ€μ λ©λͺ¨λ¦¬λ₯Ό 곡μ νλ νλ‘μΈμ€κ°) μ½μ΄λ₯Ό λ€ν νλ κ²½μ°μ /proc/sys/kernel/core_pattern
μ %p
μ§μμλ₯Ό ν΅ν΄ νμΌλͺ
μ΄λκ°μ μ΄λ―Έ νλ‘μΈμ€ IDκ° ν¬ν¨λΌ μμ§ μμΌλ©΄ νμ μ½μ΄ νμΌλͺ
μ νλ‘μΈμ€ IDλ₯Ό λ§λΆμΈλ€. (νλ‘μΈμ€μ μ€λ λλ§λ€ PIDκ° λ€λ₯Έ ꡬμ LinuxThreads ꡬνμ μΈ λ μ£Όλ‘ λμμ΄ λλ€.)
μλ νλ‘κ·Έλ¨μ ν΅ν΄ /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);
}
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