๐ก ๋ณธ ๋ฌธ์๋ 'gdb๋ก core dump ํ์ผ ๋ถ์ํ๋ ๋ฐฉ๋ฒ'์ ๋ํด ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
์ด์ฌํ ํค์๋์ ํ๋ก๊ทธ๋จ์ด ์ด๋ ๋ ๊ฐ์๊ธฐ ์ฃฝ๊ฑฐ๋ hang ๊ฑธ๋ฆฌ๋ฉฐ ๋ป์ด๋ฒ๋ฆฌ๋ ๋ชจ์ต์ ๋ณผ ๋๊ฐ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด์ ๋ก๊ทธ/์๋ฌ๋ ์ง์ logger๋ฅผ ๋ง๋ค์ด ๋ฐ๋ก ์ ์ ์ฅํด๋๊ฒ ์ง๋ง ๋ฏธ์ฒ ๊ณ ๋ คํ์ง ๋ชปํ(์๊ฐ๋ณด๋ค lowํ) ๋ถ๋ถ์์ ๋ฐ๋ก ์์ธ์ ํ์ ํ๊ธฐ๊ฐ ํ๋ญ๋๋ค. ๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ ์คํ ์ core dump๋ฅผ ๋จ๊ธฐ๊ฒ ์ค์ ํ๋ค๋ฉด, ํ๋ก๊ทธ๋จ์ด ๋์ฐ์ฌํ์ ๋ ํน์ ์์ ์ ๋ฉ๋ชจ๋ฆฌ ์ํ๋ฅผ ์ ์ ์์ด ์ด์ํ์ ์ ์ ์ฉํฉ๋๋ค. ์ด์ ๋ํ ์ค์ ๋ฐฉ๋ฒ๊ณผ gdb๋ฅผ ์ด์ฉํ ๋๋ฒ๊น ๋ฐฉ๋ฒ๋ ์ ๋ฆฌํด๋์์ผ๋ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค.
1. core ํ์ผ ๋ค๋ฃจ๊ธฐ
core dump ํ์ผ์ ELF ํ์(์คํ, ์ค๋ธ์ ํธ, ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, '์ฝ์ด๋คํ'๋ฅผ ์ํ ํ์ค ํ์ผ ํ์)์ผ๋ก x86 ๊ธฐ๋ฐ ์ ๋์ค ์์คํ ๋ค์ ํ์ค ๋ฐ์ด๋๋ฆฌ ํ์ผ ํ์์ ๋๋ค.
- ์์ธํ ๋ด์ฉ์ [Linux] Executable and Linkable Format(ELF): ์คํ ๋ฐ ๋งํน ํ์ผ ํฌ๋งท ๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
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์ ์ํ ๋น์ ๋ณ์ ๊ฐ ํ์ธ
์ฐธ๊ณ
- [gdb] stack frame ํด์ํ๊ธฐ: http://dooeui.blogspot.com/2013/09/stack-frame.html
- [System] core dump ๋ถ์์ ์ํ gdb ์ฌ์ฉ๋ฒ ๊ฐ๋จ ์ ๋ฆฌ: https://incredible-larva.tistory.com/entry/core-dump-%EB%B6%84%EC%84%9D%EC%9D%84-%EC%9C%84%ED%95%9C-gdb-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC
- [Linux] ulimit๋ก core file ์์ฑ ์ค์ : https://sh-safer.tistory.com/173