๐ก ๋ณธ ๋ฌธ์๋ 'gdb๋ก ๋๋ฒ๊น ํ๋ ๋ฐฉ๋ฒ'์ ๋ํด ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
์์ ์ค๋ช ํ gdb์ ๋ํ ๊ธฐ๋ณธ ์ค๋ช ์ ์ฝ๊ณ ์ค์ จ๋ค๋ฉด gdb๋ฅผ ์ฌ์ฉํด์ผํ ๋์ ๋ํด์๋ ์ธ์งํ์ จ์ ๊ฑฐ๋ผ ์๊ฐํฉ๋๋ค. ์ด ๋ฌธ์ ๋ด์์๋ ํ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ๋จผ์ run ๋ฐฉ์๊ณผ attach ๋ฐฉ์์ ํตํด gdb์ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ณด๊ณ , ์ถํ load ๋ฐฉ์์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
1. gdb๋ฅผ ์ตํ๊ธฐ ์ํ ๊ธฐ๋ณธ ์ธํ
1.1 C/C++ ํ์ผ ์์ฑ
๋งค์ฐ ๋จ์ํ ํ๋ก๊ทธ๋จ์ ๋๋ค. 2๊ฐ์ ์ ๋ ฅ์ธ์๋ฅผ ๋ฐ์ ๋ํ๋ ๋ฐฉ์์ด๋ค์. ์ด์ ์ด ์ฝ๋๋ฅผ ์กฐ๊ธ์ฉ ๋ถ์ํด ๋๊ฐ๋ฉฐ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ณด์์ฃ .
#include <stdio.h>
#include <stdlib.h>
static int sum(int a, int b)
{
return a + b;
}
int main(int argc, char *argv[])
{
int a;
int b;
int c;
if (argc != 3)
return -1;
a = atoi(argv[1]);
b = atoi(argv[2]);
c = sum(a, b);
printf("%d\n", c);
return 0;
}โ
1.2 C/C++ ํ์ผ ๋น๋
gdb๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ปดํ์ผ ์ gcc์ -g ์ต์ ์ ์ฃผ์ด ๋๋ฒ๊ทธ ์ ๋ณด๋ฅผ ์์ฑํด์ค์ผ ํฉ๋๋ค. ์์ธํ ๊ฑด gcc ์ต์ ์ ์ดํด๋ณด์ธ์! ๋ง์ฝ ๋น๋ ์ Makefile์ ์ด์ฉํ๋ค๋ฉด CFLAGS+="-g" ์ต์ ์ ์ถ๊ฐํด ์ฃผ์ธ์!
$ gcc example.c -g -o example
์์ ๊ฐ์ด ๋น๋ํ์๋ฉด example ์ด๋ ์ด๋ฆ์ 'ELF ํ์ผ'์ด ์์ฑ๋ฉ๋๋ค. ELF ํ์ผ์ ๋ฆฌ๋ ์ค ๋ด๋ถ์์์ ์คํํ์ผ์ด๋ผ ์๊ฐํ์๋ฉด ํธํฉ๋๋ค. ๋ -v ์ ์ต์ ์ ์ฃผ์ด ๋น๋ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋น๋ํ๋ ์์ธ ๊ณผ์ ์ ์ดํด๋ณผ ์ ์์ต๋๋ค.
$ gcc example.c -g -v example
์ด์ gdb๋ฅผ ์ด์ฉํด ELF ํ์ผ(Binary executable)์ ๋ถ์ํด๋ด ์๋ค.
1.3 C/C++ ๋น๋ ํ์ผ ์คํ
๋น๋ํ ๊ฒ์ ๋จ์ํ ์คํํ์ผ์ฒ๋ผ ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค.
$ ./example
2. gdb๋ฅผ ํ์ฉํ ๋๋ฒ๊น
2.1 gdb๋ก ELFํ์ผ ์คํํ๊ธฐ
$ gdb ./example
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./example1...done.
(gdb)
+ gdb TUI(Terminal User Interface)๋ก ์คํํ๊ธฐ
๋ค์๊ณผ ๊ฐ์ด tui ์ต์ ์ ์ฃผ๊ณ gdb ๋ฅผ ์คํํ๋ฉด terminal ์์ gui์ธ tui๋ชจ๋๋ก ์คํ์ํฌ ์ ์์ต๋๋ค.
$ gdb -tui ./example
tui๋ก gdb๋ฅผ ์คํ์ํค๋ฉด cmd(command)์ฐฝ๊ณผ src(Source)์ฐฝ์ผ๋ก ๋ถ๋ฆฌ๋์ด gdb ๋ช ๋ น์ด๋ฅผ ์ํํ๋ฉด์ ๋์์ ์์ค์ฝ๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ํ์ฌ ์คํ ์ค์ธ ๋ผ์ธ์ด ์์ค์ฐฝ์ ํ์๋์ด ํจ์ฌ ๋ ๋๋ฒ๊น ์ด ์์ํฉ๋๋ค. gdb command ์ฐฝ์์๋ ๋ณดํต gdb ๋ฅผ ์ฌ์ฉํ๋ฏ์ด ๋ช ๋ น์ด๋ฅผ ์ํํ๋ฉด ๋ฉ๋๋ค.
๋ง์ฝ ์์ค์ฝ๋๋ฅผ ํ๋ฉด์ ๋ณด์ด๋ ๋ถ๋ถ ์ด์ธ์ ๋ถ๋ถ์ ๋ณด๊ณ ์ถ์ ๋๋ focus src ๋ผ๊ณ ๋ช ๋ น์ด๋ฅผ ์ํํ๋ฉด src ์ฐฝ์ชฝ์ผ๋ก focusing ์ด ๋์ด ๋ฐฉํฅํค๋ก ์์๋ ์์ค๋ฅผ ์ด๋ํ๋ฉด์ ๋ณผ ์ ์์ต๋๋ค. ๋ค์ command ์ฐฝ์ผ๋ก focus ๋ฅผ ์ด๋ํ๊ณ ์ถ์ผ๋ฉด focus cmd ๋ผ๊ณ ์ํํ๋ฉด ๋ฉ๋๋ค.
์ถ๊ฐ๋ก, ํ์์ฒ๋ผ TUI ๊ธฐ๋ฅ ๋ง๊ณ gdb ๋ก ๋๋ฒ๊น ์ ํ์๋ค๊ฐ ๋ฌธ๋ TUI ๋ชจ๋๋ก ๋ณ๊ฒฝํ๊ณ ์ถ์ผ์๋ค๋ฉด, gdb ์ํ์์ ๊ทธ๋ฅ ctrl+xa ๋ฅผ ๋๋ฅด์๋ฉด TUI ๋ชจ๋๋ก ์๋ ์ ํ๋ฉ๋๋ค.
2.2 breakpoint(์ค๋จ์ )
2.2.1 breakpoint(์ค๋จ์ ) ์์ฑ
$ gdb -q example1
Reading symbols from example1...done.
(gdb) b sum
Breakpoint 1 at 0x400570: file example1.c, line 6.
(gdb) b main
Breakpoint 2 at 0x400589: file example1.c, line 15.
break / b ๋ช ๋ น์ด๋ก ์ค๋จ์ ์ 2๊ฐ ์์ฑํ์์ต๋๋ค. sum ํจ์์ main ํจ์๋ฅผ ์ค๋จ์ ์ผ๋ก ์ค์ ํ์์ต๋๋ค.
2.2.2 ์ค๋จ์ ์ ๋ณด ํ์ธํ๊ธฐ (info break)
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400570 in sum at example1.c:6
2 breakpoint keep y 0x0000000000400589 in main at example1.c:15
2.2.3 ํน์ ์ค๋จ์ ์ญ์ (delete / d {breakpoint number})
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400570 in sum at example1.c:6
2 breakpoint keep y 0x0000000000400589 in main at example1.c:15
(gdb) d 1
(gdb) info break
Num Type Disp Enb Address What
2 breakpoint keep y 0x0000000000400589 in main at example1.c:15
2๊ฐ์ ์ค๋จ์ ์ ์ค์ ํ ํ delete / d ๋ช ๋ น์ด๋ก 1๋ฒ ์ค๋จ์ ์ ์ ๊ฑฐํฉ๋๋ค. ๊ทธ ํ info break๋ก ์ค์ ํ ์ค๋ด์ ์ ๋ณด ํ์ธ ์ 1๋ฒ ์ค๋จ์ ์ด ์ ๊ฑฐ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
2.3 ์ด์ธ์ Stack frame ๋ถ์ํ๋ ๋ฐฉ๋ฒ
- [Blog] gdb - ๊ฐ๋จํ ๋ช ๋ น์ด/์ฌ์ฉ๋ฒ/๋จ์ถ์ด ์ ๋ฆฌ(cheat sheet): https://dining-developer.tistory.com/13
2.4 ์ถ๊ฐ: Recursion Stack frame ๋ถ์ํ๋ ๋ฐฉ๋ฒ
- [Blog] How to debug stack frames and recursion in GDB: https://developers.redhat.com/articles/2022/06/07/how-debug-stack-frames-and-recursion-gdb#
3. gdb cheat sheet
์ฐธ๊ณ
- [Blog] [gdb] The GNU Debugger : 1. Introduction: https://sonseungha.tistory.com/452
- [opensource] A programmer's guide to GNU C Compiler: https://opensource.com/article/22/5/gnu-c-compiler
- [Blog] gdb TUI (Text User Interface) – ์์ค์ฝ๋๋ณด๋ฉด์ ๋์์ ๋๋ฒ๊น ํ๊ธฐ: http://cloudrain21.com/gdb-tui-text-user-interface
- [Blog] gdb - ๊ฐ๋จํ ๋ช ๋ น์ด/์ฌ์ฉ๋ฒ/๋จ์ถ์ด ์ ๋ฆฌ(cheat sheet): https://dining-developer.tistory.com/13