Study: ComputerScience(CS)/CS: Linux

[Linux] gdb๋กœ core dump ํŒŒ์ผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•(feat. load core dump)

DrawingProcess 2022. 11. 10. 05:55
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ๋ณธ ๋ฌธ์„œ๋Š” 'gdb๋กœ core dump ํŒŒ์ผ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•'์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋†“์€ ๊ธ€์ž…๋‹ˆ๋‹ค.
์—ด์‹ฌํžˆ ํ‚ค์›Œ๋†“์€ ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋Š ๋‚  ๊ฐ‘์ž๊ธฐ ์ฃฝ๊ฑฐ๋‚˜ hang ๊ฑธ๋ฆฌ๋ฉฐ ๋ป—์–ด๋ฒ„๋ฆฌ๋Š” ๋ชจ์Šต์„ ๋ณผ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์šด์˜ ๋กœ๊ทธ/์—๋Ÿฌ๋Š” ์ง์ ‘ logger๋ฅผ ๋งŒ๋“ค์–ด ๋”ฐ๋กœ ์ž˜ ์ €์žฅํ•ด๋‘๊ฒ ์ง€๋งŒ ๋ฏธ์ฒ˜ ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•œ(์ƒ๊ฐ๋ณด๋‹ค lowํ•œ) ๋ถ€๋ถ„์—์„  ๋ฐ”๋กœ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ํž˜๋“ญ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ core dump๋ฅผ ๋‚จ๊ธฐ๊ฒŒ ์„ค์ •ํ•œ๋‹ค๋ฉด, ํ”„๋กœ๊ทธ๋žจ์ด ๋Œ์—ฐ์‚ฌํ–ˆ์„ ๋•Œ ํŠน์ • ์‹œ์ ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์–ด ์ด์ŠˆํŒŒ์•…์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์„ค์ • ๋ฐฉ๋ฒ•๊ณผ gdb๋ฅผ ์ด์šฉํ•œ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•๋„ ์ •๋ฆฌํ•ด๋‘์—ˆ์œผ๋‹ˆ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

1. core ํŒŒ์ผ ๋‹ค๋ฃจ๊ธฐ

core dump ํŒŒ์ผ์€ ELF ํ˜•์‹(์‹คํ–‰, ์˜ค๋ธŒ์ ํŠธ, ๊ณต์œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, '์ฝ”์–ด๋คํ”„'๋ฅผ ์œ„ํ•œ ํ‘œ์ค€ ํŒŒ์ผ ํ˜•์‹)์œผ๋กœ x86 ๊ธฐ๋ฐ˜ ์œ ๋‹‰์Šค ์‹œ์Šคํ…œ๋“ค์˜ ํ‘œ์ค€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

1.1 core ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ (์žฌ๋ถ€ํŒ… ์‹œ ์ดˆ๊ธฐํ™”)

1) ๋””๋ฒ„๊น… core ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์€ ์‹คํ–‰ ํŒŒ์ผ์ด ์žˆ๋Š” ํด๋”๋กœ ์ด๋™ํ•˜๊ธฐ

2) ulimit -a ๋กœ core file size ํ™•์ธํ•˜๊ธฐ

$ ulimit -a 
... 
-c: core file size (blocks) 	0 
...

3) core file size ๊ฐ€ 0์œผ๋กœ ๋˜์–ด ์žˆ๋‹ค๋ฉด? unlimited๋กœ ์„ค์ •ํ•˜๊ธฐ(kb ๋‹จ์œ„์˜ size๋ฅผ ์ง€์ •ํ•ด๋‘์–ด๋„ ๋ฉ๋‹ˆ๋‹ค)

$ ulimit -c unlimited

4) ๋‹ค์‹œ ulimit -a ๋กœ core file size ํ™•์ธํ•˜๊ธฐ

$ ulimit -a 
... 
-c: core file size (blocks) 	unlimited 
...

1.2 core ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ (์˜๊ตฌ์ )

1) /etc/security/limits.conf ํŒŒ์ผ์— ์„ค์ •ํ•˜๊ธฐ (root soft core unlimited ์ถ”๊ฐ€ํ•˜๊ธฐ)

$ nano /etc/security/limits.conf

2)  /etc/security/limits.conf ํŒŒ์ผ์— ์„ค์ • ํ™•์ธํ•˜๊ธฐ

$ cat  /etc/security/limits.conf  | grep core | grep -v ^#
root             soft    core            unlimited

3) /etc/profile ํŒŒ์ผ์— core file size๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์„ค์ • ์ฃผ์„์ฒ˜๋ฆฌํ•˜๊ธฐ

$ nano /etc/profile
...
#ulimit -S -c 0 > /dev/null 2>&1
...

4) /etc/profile ํŒŒ์ผ ํ™•์ธํ•˜๊ธฐ

$ cat /etc/profile | grep ulimit
#ulimit -S -c 0 > /dev/null 2>&1

1.3 core dump ํŒŒ์ผ ํ™•์ธํ•˜๊ธฐ

๋งŒ์•ฝ ํ”„๋กœ๊ทธ๋žจ์ด ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋Œ๊ณ  ์žˆ๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด ํŠน์ • dump๊ฐ€ ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์ด ๋งŒ๋“  ๊ฒƒ์ธ์ง€ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

file <core dump file>
  • /proc/sys/kekrnel/core_pattern ์—์„œ ์ •์˜๋œ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.
    • %p: pid
    • %u: uid
    • %g: gid
    • %s: signal number
    • %t: dump time (unix)
    • %h: host name
    • %e: process

2. gdb๋กœ core dump ํŒŒ์ผ ๋ถ„์„ํ•˜๊ธฐ

์•„๋ž˜์™€ ๊ฐ™์ด gdb๋กœ ์ ‘๊ทผํ•˜์—ฌ core dump ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ฝœ์Šคํ…์„ ์ถ”์ ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์ด ๋น„์ •์ƒ ์ข…๋ฃŒ๋œ ์›์ธ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gdb <process> <core dump file>

2.1 call stack & backtrace

(gdb) bt
(gdb) bt full
  • bt๋Š” core dump ๋ฐœ์ƒ ์ง์ „์˜ call stack์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, bt full์€ ์ „์ฒด call stack ์ •๋ณด๋ฅผ ์ž์„ธํžˆ ํ™•์ธ๊ฐ€๋Šฅ
  • stack์€ ์‹คํ–‰์ค‘์ธ ํ•จ์ˆ˜ ์ •๋ณด๋ฅผ ํ‘œ๊ธฐํ•˜๋ฉฐ ์ด๋ฅผ frame์ด๋ผ ํ•จ

2.2 stack ์†Œ์Šค ์ฝ”๋“œ ํ™•์ธ

(gdb) list

2.3 ์˜์‹ฌ๋˜๋Š” stack frame ๋ถ„์„

(gdb) f <frame name>
(gdb) info frame
(gdb) info frame <frame name>
  • info frame์€ ๊ฐ frame์˜ ๋ณด๋‹ค ์ƒ์„ธํ•œ ์ •๋ณด ์ œ๊ณต
    • stack frame at 0x: ํ•ด๋‹น ํ•จ์ˆ˜์˜ sp
    • called by frame at 0x: ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์˜ sp (e.g. main)
    • Arglist at 0x: ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ํ˜ธํ’€ํ•˜๋Š” ํ•จ์ˆ˜์˜ bp
    • args: ์ธ์ž ์ •๋ณด
    • Saved registers: rip, ebp...

2.4 ํ•ด๋‹น stack์˜ argument/local value ํ™•์ธ

(gdb) info arg
(gdb) info local
  • info frame ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜์ง€๋งŒ ์ธ๊ฐ„์นœํ™”์ 
    • arg: stack์˜ argment ํ™•์ธ
    • local: stack์˜ ์ˆ˜ํ–‰ ๋‹น์‹œ ๋ณ€์ˆ˜ ๊ฐ’ ํ™•์ธ

 

์ฐธ๊ณ 

 

๋ฐ˜์‘ํ˜•