2004년 2월 17일 화요일

gdb, 디버깅(debugging)

컴파일 할 때 -g -O0 옵션을 주고 해야 한다. (CFLAGS = -g -O0)
-O0 옵션을 주지 않았을 때 최적화가 많이 일어나서
call stack 중간 중간의 function들이 안 보인다든지, 값이 다르게 찍히는 경우가 생긴다.

그리고 strip을 해서는 안된다.
(LDFLAGS에서 '-s' 옵션을 뺀다. install에서 '-s' 옵션을 뺀다. apache라면 --without-execstip 옵션을 준다.)

gdb [실행파일명] [core파일]
---------------------------------------
[팁] gdb에서 #define macro 인식하기

Requirement: gcc 3.1 이상, gdb 5.3 이상

lumber /home/kaien/work 96 % gcc -g3 -o aa aa.c
lumber /home/kaien/work 97 % gdb aa
GNU gdb 6.2.1
Copyright 2004 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 "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".

(gdb) b main
Breakpoint 1 at 0x8048338: file aa.c, line 6.
(gdb) r
Starting program: /home/kaien/work/aa
Breakpoint 1, main () at aa.c:6
6       printf("%d\n", A);
(gdb) list
1       #include <stdio.h>
2       #define A 10
3       #define B(a) (A + a)
4       main()
5       {
6               printf("%d\n", A);
7       }
(gdb) p A
$1 = 10
(gdb) p B(20)
$2 = 30
(gdb)

한가지 유의할 점은 macro를 출력하려면 해당 macro가 있는 source line에 대해서 'list' 명령을 한번 수행해야
그 다음부터 해당 macro가 인식된다는 점입니다.

whatis : 변수의 타입을 알아내는 명령
(gdb) whatis i;

프로그램 실행하기
$ gdb 프로그램명
(gdb) break class명::함수명(인수들)            <- break point 걸기
(gdb) run 인수들

core 파일 보기
$ gdb 프로그램명 ./core.PID

댓글 없음:

댓글 쓰기