<< 2008년 7월 5일 (토) | | 2008년 7월 7일 (월) >>

gdb 사용 방법

C/C++ 프로그래밍을 하시는 분들은 gdb를 많이 사용하실겁니다. 물론 완벽하게 코딩하시면 뭐 필요 없을 테니깐요.. 간단하게나마 제가 알고 있는 것들을 공유해 드립니다. 그리 많은 정보는 아니고 이것만 알아서 쉽게 문제점들을 찾을 수 있어서 공유합니다.

1. gdb로 디버깅 방법

먼저 gdb <실행화일> -c <core 화일> 하여 디버거를 실행시킨후 아래와 같이 bt(backtrace)명령어로 어떤 함수를 부르다 죽었는지 확인합니다.
(gdb) bt // or where
#0 0xc00000000010e500:0 in pthread_mutex_lock+0x720 ()
from /usr/lib/hpux64/libpthread.so.1
#1 0xc000000000450b90:0 in __thread_mutex_lock+0xb0 ()
from /usr/lib/hpux64/libc.so.1
#2 0xc000000000424960:0 in fprintf+0x240 () from /usr/lib/hpux64/libc.so.1
#3 0x4000000000004380:0 in main (argc=2, argv=0x9ffffffffffff290)
at corpIF.C:326
(gdb)
corpIF.C의 326라인에서 보니까 main->fprintf 에서 코어가 발생했습니다.
이제 frame 명령어로 해당 스택으로 이동합니다. 이후 list 명령어로 소스 파일을 확인해 보면 정확한 원인을 유추할 수 있습니다.
(gdb) frame 2
#2 0xc000000000424960:0 in fprintf+0x240 () from /usr/lib/hpux64/libc.so.1
(gdb) list
4#2 0xc000000000424960:0 in fprintf+0x240 () from /usr/lib/hpux64/libc.so.1
(gdb) list
239 void stat_process();
240
241 ////////////////////////////////////////////////////////////////////////
242 // main
243 ////////////////////////////////////////////////////////////////////////
244 int main(int argc, char *argv[])
245 {
246 /* EXEC SQL BEGIN DECLARE SECTION; */
247
248 char *uid = (char *)"mimul/mimul@mimuldb";
(gdb)
해당 계정이 맞는 지 확인해 보시면 코어의 원인을 확인할 수 있습니다.
(gdb) print sqlca.sqlcode
$3 = -1017
(gdb)
[mimuldb]/user> oerr ora 1017
01017, 00000, "invalid username/password; logon denied"
// *Cause:
// *Action:
즉, 해당 소스 파일의 오라클 계정의 아이디와 패스워드가 불일치하여 생긴 코어임을 최종 확인할 수 있습니다.

2. 그외 참고 사항
여기는 gdb에 관련된 간단한 커맨드 사용 방법을 알려드립니다.
[mimuldb]/user>gdb a.out
(gdb) r 20080707 // arg1- 실행
Starting program: /user/corpIF 20080707
warning: Load module /oracle/ORA9/lib/libclntsh.so.10.1 has been stripped.
Debugging information is not available.

warning: Load module /oracle/ORA9/lib/libnnz10.so has been stripped.
Debugging information is not available.

오라클 데이타베이스 연결에 실패하였습니다.
[mimul/mimul@mimuldb, ORA-01017: invalid username/password; logon denied]

Program received signal SIGSEGV, Segmentation fault
si_code: 2 - SEGV_ACCERR - Invalid Permissions for object.
0x9fffffffbf65e500:0 in pthread_mutex_lock+0x720 ()
from /usr/lib/hpux64/libpthread.so.1
(gdb) l 50 // 50근처의 소스 전후 10라인 표시
45 /* Binding to PL/SQL Records */
46 struct sqltdss
47 {
48 unsigned int tdsvsn;
49 unsigned short tdsnum;
50 unsigned char *tdsval[1];
51 };
52 typedef struct sqltdss sqltdss;
53 static struct sqltdss sqltds =
54 {
(gdb) l stat_process // stat_process함수 위치의 10라인 표시
512
513 ////////////////////////////////////////////////////////////////////////
514 //
515 ////////////////////////////////////////////////////////////////////////
516 void stat_process()
517 {
518 /* EXEC SQL BEGIN DECLARE SECTION; */
519
520 int v_Result;
521 /* varchar v_Status[32+1]; */
(gdb) next //다음라인까지 프로그램 실행
(gdb) step // 다음 instruction 실행
(gdb) finish // 현재 프로그램 실행 중지
(gdb) up // 이전 프레임
(gdb) down // 다음 프레임
(gdb) call myfunction() // 사용자 정의 함수 호출
(gdb) display x // x라는 변수의 값 출력
PS : //이하 문자열은 제가 주석으로 인식하고 해당 커맨드를 설명하는 문구를 넣음
태그 :