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 件のコメント:
コメントを投稿