2012年2月19日日曜日

gdbを使ったデバッグメモ

gdbを使ったデバッグメモ

1. 次のコードを作成します。
あえてNULLポインタをいれて、エラーがでるようにしてあります

[debug.c]
#include
#include

int main(void){
    char *ptr = NULL;
    strcpy( ptr, "Hello Debug\n");
    printf("%s", ptr);
    return 0;
}

2. 準備
コアダンプするため、ユーザの制限を外しておきます
$ ulimit -c unlimited

3. コンパイル
-gはデバッグする場合は必要です。
-Wallは-Wオプションがすべて(すべてで警告をだします)
$ gcc -g -Wall -o debug debug.c

4. 実行してみます。
$ ./debug
セグメンテーション違反です (core dumped)

5. gdbを使ってデバッグしてみます。
$ gdb debug core
GNU gdb 6.8-debian
...
warning: Can't read pathname for load map: Input/output error.
Reading symbols from /lib/i686/cmov/libc.so.6...done.
Loaded symbols for /lib/i686/cmov/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./debug'.
Program terminated with signal 11, Segmentation fault.
[New process 3012]
#0  0xb7eeec15 in memcpy () from /lib/i686/cmov/libc.so.6

さらに詳しく見ていきます
(gdb) where
#0  0xb7eeec15 in memcpy () from /lib/i686/cmov/libc.so.6
#1  0x08048407 in main () at debug.c:6

6行目に問題があるようです
(gdb) up
#1  0x08048407 in main () at debug.c:6
6        strcpy( ptr, "Hello Debug\n");

ptrの内容を出してみます。
(gdb) print ptr
$1 = 0x0

6. gdbでソースを細かく見ていきます。listでソースを表示し、runで実行します。
(gdb) list
1    #include
2    #include
3   
4    int main(void){
5        char *ptr = NULL;
6        strcpy( ptr, "Hello Debug\n");
7        printf("%s", ptr);
8        return 0;
9    }

(gdb) run
Starting program: /home/atmark/workspace/work/debug

Program received signal SIGSEGV, Segmentation fault.
0xb7e27c15 in memcpy () from /lib/i686/cmov/libc.so.6

7. ブレークポイントを設定してみます。nextで1行ずつ実行、continueで最後まで実行します。
(gdb) break 6
Breakpoint 1 at 0x80483ec: file debug.c, line 6.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/atmark/workspace/work/debug

Breakpoint 1, main () at debug.c:6
6        strcpy( ptr, "Hello Debug\n");
(gdb) next

Program received signal SIGSEGV, Segmentation fault.
0xb7e91c15 in memcpy () from /lib/i686/cmov/libc.so.6

(gdb) continue
Continuing.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.

0 件のコメント:

コメントを投稿