๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ ๋ณด์•ˆ·์ทจ์•ฝ์ /๐Ÿ”ธ์‹œ์Šคํ…œ·์šด์˜์ฒด์ œ

[ubuntu] gdb ์‹ค์Šต

by Jenny:! 2022. 8. 21.

1. gcc

์šฐ๋ถ„ํˆฌ๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๋ณดํ†ต gcc ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค.

 

 

gcc๋ฅผ ์ž…๋ ฅํ•ด ๊ฐ„๋‹จํžˆ ์„ค์น˜๋ฅผ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ์„ค์น˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๋งŒ์•ฝ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ์•„๋ž˜์˜ ์ฝ”๋“œ๋กœ ์„ค์น˜ํ•ด์ค€๋‹ค.

 

 

gcc ์„ค์น˜

$ sudo apt-get install gcc

 

 

 

gcc ๋ฒ„์ „ ํ™•์ธ

$ gcc --version

 

 

 

์ปดํŒŒ์ผ ์‹œ -m32 ์˜ต์…˜์œผ๋กœ 32๋น„ํŠธ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ทธ๋Ÿฌ๋‚˜ libc-header-start.h๊ฐ€ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

$ sudo apt-get install libx32gcc-4.8-dev

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

 

 

 

2. gdb & pwndbg

 

gdb ์„ค์น˜

$ sudo apt-get install gdb

 

 

pwndbg ์„ค์น˜

$ git clone https://github.com/pwndbg/pwndbg.git
$ cd pwndbg

$ ./setup.sh

 

 

๋Œ์•„์™€์„œ pwndbg๊ฐ€ ์‹คํ–‰์ด ๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

$ cd

$ gdb test.txt

 

 

์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๋ฉด ์ •์ƒ์ž‘๋™๋˜์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ pwndbg ๋Œ€์‹  ๋ฆฌ๋ˆ…์Šค์˜ ๊ธฐ๋ณธ ๋””๋ฒ„๊ฑฐ๋กœ ์‹คํ–‰๋œ๋‹ค.

 

 

~/.gdbinit ์—์„œ ๊ธฐ๋ณธ ๋””๋ฒ„๊ฑฐ ํŒŒ์ผ์„ ์‚ญ์ œํ•œ๋‹ค.

(ํ˜น์€ ๋ชจ๋‘ ์ง€์šฐ๊ณ  ์žฌ์„ค์น˜)

 

 

์ด์ œ pwndbg๋กœ ์‹คํ–‰์ด ๋œ๋‹ค.

 

 

 

 

 

1. GDB

  • ๋””๋ฒ„๊ฑฐ : ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐํ•จ(๋ฒ„๊ทธ)๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ

GDB๊ฐ™์€ ๋””๋ฒ„๊ฑฐ์˜ ๋ชฉ์ ์€ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ์ค‘์—  ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ ํ”„๋กœ๊ทธ๋žจ์ด ์ž˜๋ชป ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ ๊ทธ ํ”„๋กœ๊ทธ๋žจ ‘๋‚ด๋ถ€์—์„œ’ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. GDB๋Š” C, C++, Modula-2 ์ฝ”๋“œ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋””๋ฒ„๊ทธํ•  ์ˆ˜ ์žˆ๋‹ค. ์‰˜์—์„œ gdb๋กœ GDB๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ์ข…๋ฃŒ ๋ช…๋ น quit ์ „๊นŒ์ง€๋Š” ํ„ฐ๋ฏธ๋„๋กœ๋ถ€ํ„ฐ ๋ช…๋ น๋ผ์ธ์„ ์ฝ์–ด๋“ค์ธ๋‹ค.

 

๋””๋ฒ„๊น…์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” –g ์˜ต์…˜์„ ์ฃผ๊ณ  ์ปดํŒŒ์ผ/๋งํฌ ํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ๋งํฌ๊ฐ€ libg.a๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ํ•˜๋ฉด, /usr/lib/ligb.a๋ฅผ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ ํŒŒ์ผ์€ ํŠน๋ณ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ์„œ ๋””๋ฒ„๊น… ๊ฐ€๋Šฅํ•œ C๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. libc ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ๋˜๋Š” libc ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์„œ ์ปดํŒŒ์ผํ•˜๋ฉด ํŒŒ์ผ์ด์ƒ๊ธด๋‹ค. /usr/lib/libc.a๋ฅผ /usr/lib/libg.a๋กœ ๋งํฌ์‹œ์ผœ๋„ ๋œ๋‹ค.

 

1.1. ์ฝ”์–ดํŒŒ์ผ ๋ถ„์„ํ•˜๊ธฐ


์ฝ”์–ดํŒŒ์ผ์€ ์ถฉ๋Œํ•  ๋‹น์‹œ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์ด๋ฏธ์ง€๋ฅผ ๋คํ”„ํ•œ ๊ฒƒ์ด๋‹ค. ์ฝ”์–ดํŒŒ์ผ์„ gdb์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ๋ฅผ ์กฐ์‚ฌํ•˜๊ณ  ์‹คํŒจ ์›์ธ์„ ๊ทœ๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ด๋–ค ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ผ์ด ๋ฐœ์ƒํ•˜์—ฌ ๋น„์ •์ƒ์ ์ธ ์ข…๋ฃŒ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ์šด์˜์ฒด๊ณ„๋Š” ๋””์Šคํฌ์— ์ฝ”์–ด ํŒŒ์ผ์„ ๋‚จ๊ธด๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์— ๊ด€ํ•œ ๋ฌธ์ œ๋Š” Checker ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ fault๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒฝ์šฐ์—๋Š” ์ถฉ๋Œํ•˜๋ฉฐ ํŒŒ์ผ์„ ๋คํ”„ํ•œ๋‹ค. ์ฝ”์–ดํŒŒ์ผ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰์‹œํ‚จ ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑ๋˜์ง€๋งŒ, ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

๋ณดํ†ต ๋ฆฌ๋ˆ…์Šค๋Š” ๋ถ€ํŒ…์‹œ์— ์ฝ”์–ด ํŒŒ์ผ์„ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก ์„ธํŒ…๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”์–ด ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด, ์…€์˜ ๋‚ด์žฅ ๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

  • C์‰˜ ํ˜ธํ™˜ ์‰˜(tcsh)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
    $ limit core unlimited

 

  • ๋ณธ์‰˜๋ฅ˜(sh , bash , zsh , pdksh)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
    $ ulimit –c unlimited

 

  • ์ฝ”์–ดํŒŒ์ผ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
    $ gdb program core

 

  • ํ˜„์žฌ ์„ค์ •๊ฐ’ ํ™•์ธ
    $ ulimte -a

 

1.2. ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ ๋””๋ฒ„๊น…ํ•˜๊ธฐ

gdb๋Š” ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ๋„ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ํ”„๋กœ์„ธ์Šค ์‹คํ–‰์„ ๊ฐ€๋กœ์ฑ„๊ณ  ์กฐ์‚ฌํ•œ ๋’ค ๋‹ค์‹œ ์›๋ž˜ ์ƒํƒœ๋กœ ์‹คํ–‰ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

attach๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์„œ์— gdb๋ฅผ ๋ถ™์ธ๋‹ค. attach ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœ์„ธ์Šค์— ํ•ด๋‹นํ•˜๋Š” ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์— ํ—ˆ๊ฐ€๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 


e.g. ํ”„๋กœ์„ธ์Šค ID 254๋ฒˆ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ pgmseq ํ”„๋กœ๊ทธ๋žจ
$ gdb pgmseq
$ attach 254
ํ˜น์€
$ gdb pgmseq 254



์ผ๋‹จ gdb๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์— ๋ถ€์ฐฉ๋˜๋ฉด, ํ”„๋กœ๊ทธ๋žจ์„ ์ผ์‹œ ์ค‘์ง€์‹œํ‚ค๊ณ  gdb๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์–ด๊ถŒ์„ ๊ฐ€์ ธ์˜จ๋‹ค. break๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘์ง€์ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์ค‘์ง€์ ์— ์ด๋ฅผ ๋•Œ๊นŒ์ง€ ์‹คํ–‰ํ•˜๋„๋ก continue ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. detach๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ gdb๋ฅผ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ถ„๋ฆฌํ•œ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•˜์—ฌ attach๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


2. gdb์‹œ์ž‘ํ•˜๊ธฐ


% gdb
- gdb๋ฅผ ๋จผ์ € ์‹คํ–‰ ํ›„ file์ด๋ผ๋Š” ๋ช…๋ น์œผ๋กœ program์„ ๋ถ€๋ฅธ๋‹ค.

% gdb program
- ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

% gdb program core
- ์ฝ”์–ดํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋™์‹œ์— ์ธ์ž๋กœ ์ค€๋‹ค.

% gdb program 1234
- ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋””๋ฒ„๊ทธ ํ•˜๋ ค๋ฉด ํ”„๋กœ์„ธ์Šค ID๋ฅผ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ๋ฉด ๋œ๋‹ค. ์ด ๋ช…๋ น์€ gdb๋ฅผ (‘1234’ ๋ž€ ์ด๋ฆ„์˜ ํŒŒ์ผ์ด ์—†๋‹ค๋ฉด) ํ”„๋กœ์„ธ์Šค 1234์— ์ ‘์†์‹œํ‚จ๋‹ค.(gdb๋Š” coreํŒŒ์ผ์„ ๋จผ์ € ์ฐพ๋Š”๋‹ค.)

์‹คํ–‰์ ˆ์ฐจ
% gcc –g test.c –o test
% gdb test

์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค.

% gdb test
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
Welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “i386-redhat-linux”...
(gdb)


 

3. ๋ช…๋ น์–ด

 

list ํ˜„์žฌ ์œ„์น˜์—์„œ ์†Œ์Šค ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ 10์ค„ ๋ณด์—ฌ์ค€๋‹คlist 2, 15 : ์†Œ์Šค ํŒŒ์ผ์˜2 ~ 15 ๊นŒ์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
run ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•œ๋‹ค.(break๊ฐ€ ์žˆ๋‹ค๋ฉด break๊นŒ์ง€ ์‹คํ–‰)run arg : ์ƒˆ๋กœ์šด ์ธ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•œ๋‹ค.arg๋Š” “*”๋‚˜ “[…]”๋ฅผ ํฌํ•จํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์‰˜์˜ ์‚ฌ์šฉ๊นŒ์ง€๋„ ํ™•์žฅ๋  ์ˆ˜ ์žˆ๋‹ค.“<”,“>” , “>>”๊ฐ™์€ ์ž…์ถœ๋ ฅ ๋ฐฉํ–ฅ ์žฌ์ง€์ •๊ธฐํ˜ธ๋„ ๋˜ํ•œ ํ—ˆ์šฉ๋œ๋‹ค.
break ํŠน์ • ๋ผ์ธ์ด๋‚˜ ํ•จ์ˆ˜์— ์ •์ง€์ ์„ ์„ค์ •ํ•œ๋‹ค.break function : ํ˜„์žฌ ํŒŒ์ผ ์•ˆ์˜ ํ•จ์ˆ˜ function์— ์ •์ง€์ ์„ ์„ค์ •ํ•œ๋‹ค.break file:function : ํŒŒ์ผfile์•ˆ์˜ function์— ์ •์ง€์ ์„ ์„ค์ •ํ•œ๋‹ค.watch : ๊ฐ์‹œ์  ์„ค์ •(๊ฐ์‹œ์ ์€ ์–ด๋–ค์‚ฌ๊ฑด์ด ์ผ์–ด๋‚  ๋•Œ์—๋งŒ ์ž‘๋™ํ•œ๋‹ค)until : ์‹คํ–‰์ค‘ line๊นŒ์ง€ ์‹คํ–‰
clear ํŠน์ • ๋ผ์ธ์ด๋‚˜ ํ•จ์ˆ˜์— ์žˆ๋˜ ์ •์ง€์ ์„ ์‚ญ์ œํ•œ๋‹ค.
delete ๋ช‡๋ช‡ ์ •์ง€์ ์ด๋‚˜ ์ž๋™์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ํ‘œํ˜„์„ ์‚ญ์ œํ•œ๋‹ค.
next ๋‹ค์Œ ํ–‰์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์„œ๋ธŒ๋ฃจํ‹ด์„ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๊ณ„์† ์ˆ˜ํ–‰ํ•œ๋‹ค.ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด step์™€ ๊ฐ™๋‹ค.next n : ์ด๋ฅผ n๋ฒˆ ์ˆ˜ํ–‰ํ•˜๋ผ๋Š” ์˜๋ฏธ
step ํ•œ ์ค„์”ฉ ์‹คํ–‰ ์‹œํ‚จ๋‹ค. ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€์„œ ํ•œ ์ค„์”ฉ ์‹คํ–‰์‹œํ‚จ๋‹ค.
print print expr : ์ˆ˜์‹์˜ ๊ฐ’์„ ๋ณด์—ฌ์ค€๋‹ค.
display ํ˜„์žฌ display๋œ ๋ช…๋ น์˜ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค€๋‹ค.
bt ํ”„๋กœ๊ทธ๋žจ ์Šคํƒ์„ ๋ณด์—ฌ์ค€๋‹ค. (backtrace)
kill ๋””๋ฒ„๊น… ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์„ ์ทจ์†Œํ•œ๋‹ค.
file file program : ๋””๋ฒ„๊น…ํ•  ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ์„œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•œ๋‹ค.
cont continue : ํ˜„์žฌ ์œ„์น˜์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ณ„์† ์‹คํ–‰ํ•œ๋‹ค.
help ๋ช…๋ น์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ ์ผ๋ฐ˜์ ์ธ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
quit gdb์—์„œ ๋น ์ ธ๋‚˜๊ฐ„๋‹ค.







4. ์‹ค์Šต

 

4.1 ์˜ˆ์ œ1


% vi test.c

1 #include <stdio.h>
2
3 main()
4 {
5 int i;
6 double j;
7 /*๋‹ค์Œ์€i/2+i์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ด๋‹ค. 8 i๊ฐ€1์ด๋ฉด j๋Š”1.5๊ฐ€ ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ์‹ค์ œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.*/ 9 for( i=0; i<5 ; i++){
10 j=i/2+i;
11 printf(“j is %f \n”,j);
12 }
13 }


% gcc –g test.c –o test


% test
์‹คํ–‰์ด ๋˜์ง€ ์•Š์œผ๋ฉด mv test a.out์œผ๋กœ ํ•˜์—ฌ a.out์„ ์‹คํ–‰์‹œํ‚จ๋‹ค. ์‹คํ–‰์„ ์‹œํ‚ค๋ฉด ์›ํ•˜๋Š” ๋‹ต์ด ์•„๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด gdb๋ฅผ ํ•ด๋ณด์ž.
% gdb a.out
(gdb) list // list๋Š” ์†Œ์Šค ๋‚ด์šฉ์„ 10์ค„์”ฉ ๋ณด์—ฌ์ค€๋‹ค.
1 #include <stdio.h>
2
3 main()
4 {
5 int i;
6 double j;
7 /*๋‹ค์Œ์€ i/2+i์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ด๋‹ค.

8 i๊ฐ€1์ด๋ฉด j๋Š”1.5๊ฐ€ ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ์‹ค์ œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.*/
9 ( i=0; i<5 ; i++){
j=i/2+i;

(gdb) b 9 // break 9 : for ๋ฌธ์— ์ด์ƒ์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ line 9์— breakpoint๋ฅผ ์žก๋Š”๋‹ค.
Breakpoint 1 at 0x80483d6: file test.c, line 9.
(gdb) r // run : breakpoint๊นŒ์ง€ ์‹คํ–‰๋œ๋‹ค.
Starting program: /home/pllab/chowing/gdb/a.out
Breakpoint 1, main () at test.c:9
9 for( i=0; i<5 ; i++){
(gdb) s // step : ํ•œ์ค„ ์‹คํ–‰์‹œํ‚จ๋‹ค.
j=i/2+i;
(gdb) s
11 printf(“j is %f \n”,j);
(gdb) p j // print j : j์˜ ๊ฐ’์„ ๋ณธ๋‹ค.
$2 = 0
(gdb) n
j is 0.000000
for( i=0; i<5 ; i++){
(gdb) display i
(gdb) display j
(gdb) n
11 printf(“j is %f \n”,j);
2: j = 1
1: i = 1
// 10 line์—์„œ ์‹คํ–‰ ํ›„ i=1์ผ ๋•Œ, j=1์ด๋ฏ€๋กœ 10 line์—์„œ ์ž˜๋ชป๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.// 10 line์„ j = (double) i/2 + i; ๋กœ ๊ณ ์นœ๋‹ค.
(gdb) quit

 

 

4.2 ์˜ˆ์ œ2


% vi hab.c

1 #include <stdio.h>
2
3 int hab(int x, int y);
4
5 main(void)
6 {
7 int a, b,dab;
8 printf(“์ •์ˆ˜a, b๋ฅผ ์ž…๋ ฅํ•˜์‹œ์˜ค”); 9 scanf(“%d %d”,&a,&b);
10 dab = hab(a,b);
11 printf(“\n%d + %d = %d \n”,a,b,dab);
12 }
13 int hab(int x, int y)
14 {
15 return (x + y);
16 }



// ์ด ํ”„๋กœ๊ทธ๋žจ์€ ์ด์ƒ ์—†๋‹ค. ์Šคํƒ์„ ๋ณด๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.// ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚  ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž. ์ด ๋•Œ๋Š” ํ•จ์ˆ˜๊ฐ€ ์–ด๋””๋กœ๋ถ€ํ„ฐ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ ์ž ํ•  ๊ฒƒ์ด๋‹ค.backtrace (bt) ๋ช…๋ น์„ ์ด์šฉํ•˜๋ฉด ์ถฉ๋Œ์ด ์ผ์–ด๋‚œ ์‹œ์ ์—์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ํ˜„์žฌ ํ˜ธ์ถœ ์Šคํƒ(call stack) ์ƒํƒœ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ˜ธ์ถœ ์Šคํƒ์€ ํ˜„์žฌ ํ•จ์ˆ˜๊นŒ์ง€ ์ด๋ฅด๋Š” ํ˜ธ์ถœ ๋ชฉ๋ก์ด๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋ณด๊ด€๋œ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’, ํ•จ์ˆ˜ ์ „๋‹ฌ ์ธ์ˆ˜, ์ง€์—ญ ๋ณ€์ˆ˜ ๋“ฑ์˜ ์ž๋ฃŒ๋ฅผ ์Šคํƒ์— pushํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์„œ ๊ฐ ํ•จ์ˆ˜๋“ค์€ ์Šคํƒ์ƒ์— ์ผ์ • ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•œ๋‹ค. ํŠน์ •ํ•จ์ˆ˜์— ๋Œ€ํ•˜์—ฌ ์Šคํƒ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ฉ”๋กœ๋ฆฌ ๋ถ€๋ถ„์„ ์Šคํƒํ”„๋ ˆ์ž„(frame)์ด๋ผ ๋ถ€๋ฅด๋ฉฐ ํ˜ธ์ถœ ์Šคํƒ์€ ์ด๋Ÿฌํ•œ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•œ ๋ชฉ๋ก์ด๋‹ค.


% gdb hab

(gdb) b 10 Breakpoint 2 at 0x8048428: file hab.c, line 10.

(gdb) r
Starting program: /home/pllab/chowing/gdb/hab
์ •์ˆ˜a, b๋ฅผ ์ž…๋ ฅํ•˜์‹œ์˜ค3 4
breakpoint 2, main () at hab.c:10
10 dab = hab(a,b);

(gdb) bt // ํ˜„์žฌ ์Šคํƒ์— main์ด ์žˆ๋‹ค.
#0 main () at hab.c:10

(gdb) s
hab (x=3, y=4) at hab.c:15
15 return (x + y);

(gdb) bt // ์ง€๊ธˆ์€ ์Šคํƒ์— hab์ด ์žˆ๋‹ค.
#0 hab (x=3, y=4) at hab.c:15
#1 0x8048435 in main () at hab.c:10

(gdb) frame 0 // hab์˜ ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์Šคํƒ ํ”„๋ ˆ์ž„0๋ฒˆ์œผ๋กœ ์ด๋™
#0 hab (x=3, y=4) at hab.c:15
15 return (x + y);

(gdb) up // hab์ด ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜์—ˆ๋Š”๊ฐ€๋ฅผ ๋ณด๊ธฐ ์œ„ํ•˜์—ฌ ์ƒ์œ„ ์Šคํƒํ”„๋ ˆ์ž„์œผ๋กœ ์ด๋™
#1 0x8048435 in main () at hab.c:10
dab = hab(a,b);

(gdb) finish

(gdb) info program // ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ ์ค€๋‹ค.
Using the running image of child Pid 12909.
Program stopped at 0x804843d.
It stopped after being stepped.

(gdb) info locals // ํ˜„์žฌ ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ชจ๋“  ์ง€์—ญ ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.
a = 3
b = 4
dab = 7

(gdb) info variables // ์†Œ์ŠคํŒŒ์ผ ์ˆœ์„œ๋Œ€๋กœ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์— ์•Œ๋ ค์ ธ ์žˆ๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

(gdb) info address a // ์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ์–ด๋””์— ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•˜์—ฌ ์•Œ๋ ค ์ค€๋‹ค.
Symbol “a” is a local variable at frame offset -4.
// a๊ฐ€ ์Šคํƒํ”„๋ ˆ์ž„ ๊ผญ๋Œ€๊ธฐ๋กœ๋ถ€ํ„ฐ4๋ฐ”์ดํŠธ ์•„๋ž˜์— ๋†“์—ฌ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.(gdb) info frame // ํ˜„์žฌ ํ”„๋ ˆ์ž„ ์ •๋ณด๋ฅผ ๋ณด์—ฌ ์ค€๋‹ค.
Stack level 0, frame at 0xbffff848:
eip = 0x804843d in main (hab.c:11); saved eip 0x400301eb
source language c.
Arglist at 0xbffff848, args:
Locals at 0xbffff848, Previous frame’s sp is 0x0
Saved registers:
ebp at 0xbffff848, eip at 0xbffff84c

 

 

4.3 ์˜ˆ์ œ3


% vi core.c

1 #include <stdio.h>
2
3 main()
4 {
5 char *bug = NULL;
6
7 strcpy(bug,“debug”);
8 printf(“bug is %s \n”,bug);
9
10 return;
11 }
12


% coredebug
Segmentation fault
// core ํŒŒ์ผ ์ƒ์„ฑ
% gdb coredebug

(gdb) b 7
Breakpoint 1, main () at core.c:7
7 strcpy(bug,”debug”);

(gdb) p bug
$1 = 0x0 // gdb ์—์„œ0x0๋Š” null์ด๋‹ค. ์ฆ‰ ๋ฒˆ์ง€๊ฐ€ ์—†๋‹ค.

(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x40075434 in ?? ()
// strcpy์—์„œ segmentation fault๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.// bug์— ๋ฒˆ์ง€๋ฅผ ํ• ๋‹นํ•˜๋ฉด ๋œ๋‹ค.

% gdb corebug core // coreํŒŒ์ผ์„ ์ด์šฉํ•˜๋ฉด bug์ •๋ณด๊ฐ€ ๋‚˜์˜จ๋‹ค.
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “i386-redhat-linux”...
warning: core file may not match specified executable file.
Core was generated by ‘a.out’.
Program terminated with signal 11, ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ ์˜ค๋ฅ˜.
Reading symbols from /lib/libc.so.6...done.
Reading symbols from /lib/ld-linux.so.2...done.
#0 strcpy (dest=0x0, src=0x8048490 “debug”) at ../sysdeps/generic/strcpy.c:38
../sysdeps/generic/strcpy.c: ๊ทธ๋Ÿฐ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์—†์Œ. gdb๋Š” signal 11 ๋ฒˆ๊ณผ ํ•จ๊ป˜ ์ฝ”์–ด ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ์•Œ๋ ค ์ค€๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ํ—ˆ๊ฐ€๋ฐ›์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ฝ๊ธฐ, ์“ฐ๊ธฐ๋ฅผ ์‹œ๋„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋„์ด ํ”„๋กœ์„ธ์Šค์—๊ฒŒ signal 11์„ ๋ณด๋ƒˆ๋‹ค.์ด ์‹œ๊ทธ๋„๋กœ ์ธํ•ด ํ”„๋กœ์„ธ์Šค๋Š” ์ข…๋ฃŒํ•˜๋ฉด์„œ ์ฝ”์–ด ํŒŒ์ผ์„ ๋คํ”„ํ•œ๋‹ค.


4. ๊ธฐํƒ€

Breakpoint
์ค‘์ง€์ ์„ ์กฐ๊ฑด์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์–ด๋–ค ๋™์ž‘์ด ์ฐธ์ผ ๋•Œ๋งŒ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
ex) break 184 if (stace == 0) info break๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ์ค‘์ง€์ ๊ณผ ๊ฐ์‹œ์  ๋ชฉ๋ก๊ณผ ๊ทธ ์ƒํƒœ๋„ ๋ณด์—ฌ์ค€๋‹ค.

disable์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™๋ถˆ๋Šฅ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ณ , enable์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.


์ธ์ŠคํŠธ๋Ÿญ์…˜ ๋ ˆ๋ฒจ ๋””๋ฒ„๊น… gdb๋ฅผ ํ†ตํ•ด ์ธ์ŠคํŠธ๋Ÿญ์…˜ ๋ ˆ๋ฒจ์˜ ๋””๋ฒ„๊น…์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ๋งค์šฐ ๊นŠ์€ ๋‚ด๋ถ€๊นŒ์ง€ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

(gdb) disass play

playํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ


(gdb) display/ i $pc

ํ˜„์žฌ์˜ ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ๋ณด์—ฌ์ค€๋‹ค. $pc๋Š” gdb๋‚ด๋ถ€ ๋ณ€์ˆ˜๋กœ์„œ ํ˜„์žฌ ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ์ด๋‹ค.

 


GDB์— ๋Œ€ํ•œ ๋งค๋‰ด์–ผ
http://kkucc.konkuk.ac.kr/~kipal/html/gdb-man.html
http://pl.changwon.ac.kr/~chowing/gdb_man.html


์ฐธ๊ณ 

http://optimizer.snu.ac.kr/yanne/