サンプル集 |
■VC ■C# ■Java ■LinuxC ■MS-DOS ■bash ■Excel VBA ■PHP ■HTML ■perl ■iPhone ■Android ■other |
Linuxコマンド |
debian メモ |
apache2 メモ |
MySQL メモ |
Oracle メモ |
HOME |
セグメンテーションフォルトの原因調査をします。
◆環境OS | 6.0.5 Linux obsax3 3.0.6 #1 SMP Thu Mar 7 19:14:19 JST 2013 armv7l GNU/Linux |
---|---|
gcc | 4.4.5 (Debian 4.4.5-8) |
gdb | 7.0.1-debian |
セグメンテーションフォルトの調査をするためにコア・ダンプを出力するように設定します。
事前準備
(1)コア・ダンプの容量制限を解除します。
# ulimit -c unlimited
(2) -g オプションを付けてコンパイルします。
# gcc test.c -o test -g
デバッグ
セグメンテーションフォルトが発生するモジュールを実行します。
# ./test
[1] 3763
[1]+ Segmentation fault (core dumped) ./test
[1] 3763
[1]+ Segmentation fault (core dumped) ./test
gdbにcoreファイルを読み込ませます。
# gdb test core
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl
.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copyi
ng"
and "show warranty" for details.
This GDB was configured as "arm-linux-gnueabi".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/test...done.
Reading symbols from /usr/lib/libmysqlclient.so.16...(no debugging symb
ols found)...done.
Loaded symbols for /usr/lib/libmysqlclient.so.16
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...do
ne.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libm.so.6...(no debugging symbols found)...do
ne.
Loaded symbols for /lib/libm.so.6
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found
)...done.
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/libcrypt.so.1...(no debugging symbols found).
..done.
Loaded symbols for /lib/libcrypt.so.1
Reading symbols from /lib/libnsl.so.1...(no debugging symbols found)...
done.
Loaded symbols for /lib/libnsl.so.1
Reading symbols from /usr/lib/libz.so.1...(no debugging symbols found).
..done.
Loaded symbols for /usr/lib/libz.so.1
Reading symbols from /lib/libgcc_s.so.1...(no debugging symbols found).
..done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/ld-linux.so.3...(no debugging symbols found).
..done.
Loaded symbols for /lib/ld-linux.so.3
Reading symbols from /lib/libnss_files.so.2...(no debugging symbols fou
nd)...done.
Loaded symbols for /lib/libnss_files.so.2
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0 0x40498884 in strlen () from /lib/libc.so.6
(gdb)
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl
.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copyi
ng"
and "show warranty" for details.
This GDB was configured as "arm-linux-gnueabi".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/test...done.
Reading symbols from /usr/lib/libmysqlclient.so.16...(no debugging symb
ols found)...done.
Loaded symbols for /usr/lib/libmysqlclient.so.16
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...do
ne.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libm.so.6...(no debugging symbols found)...do
ne.
Loaded symbols for /lib/libm.so.6
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found
)...done.
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/libcrypt.so.1...(no debugging symbols found).
..done.
Loaded symbols for /lib/libcrypt.so.1
Reading symbols from /lib/libnsl.so.1...(no debugging symbols found)...
done.
Loaded symbols for /lib/libnsl.so.1
Reading symbols from /usr/lib/libz.so.1...(no debugging symbols found).
..done.
Loaded symbols for /usr/lib/libz.so.1
Reading symbols from /lib/libgcc_s.so.1...(no debugging symbols found).
..done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/ld-linux.so.3...(no debugging symbols found).
..done.
Loaded symbols for /lib/ld-linux.so.3
Reading symbols from /lib/libnss_files.so.2...(no debugging symbols fou
nd)...done.
Loaded symbols for /lib/libnss_files.so.2
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0 0x40498884 in strlen () from /lib/libc.so.6
(gdb)
セグメンテーションフォルトが発生した行を特定します。
(gdb) backtrace ←バックトレース
#0 0x40498884 in strlen () from /lib/libc.so.6
#1 0x40463c78 in vfprintf () from /lib/libc.so.6
#2 0x404813dc in vsprintf () from /lib/libc.so.6
#3 0x4046a378 in sprintf () from /lib/libc.so.6
#4 0x0000a9c0 in makeMessage (msg=0xbea64764 "0") at test.c:1207
#5 0x0000a8a4 in sendMessge (sock=4) at test.c:1145
#6 0x00009ae4 in communication (dstSocket=4) at test.c:628
#7 0x00009624 in connection (conn=0x16c80) at test.c:367
#8 0x00009430 in main () at test.c:307
(gdb)
#0 0x40498884 in strlen () from /lib/libc.so.6
#1 0x40463c78 in vfprintf () from /lib/libc.so.6
#2 0x404813dc in vsprintf () from /lib/libc.so.6
#3 0x4046a378 in sprintf () from /lib/libc.so.6
#4 0x0000a9c0 in makeMessage (msg=0xbea64764 "0") at test.c:1207
#5 0x0000a8a4 in sendMessge (sock=4) at test.c:1145
#6 0x00009ae4 in communication (dstSocket=4) at test.c:628
#7 0x00009624 in connection (conn=0x16c80) at test.c:367
#8 0x00009430 in main () at test.c:307
(gdb)
最終的にセグメンテーションフォルトが発生したのはstrlenでした。 そこから遡って見ていくと、strlenはvfprintfから呼び出されたようです。 vfprintfはvsprintfから、さらにvsprinfはsprintfから呼び出され、sprintfはmakeMessageから呼び出された事が分かります。 makeMessagesはtest.cにある関数で、test.cの1207行目でsprintfを呼び出してセグメンテーションフォルトになった事が分かります。
gdbが無い場合
apt-getでgdbをインストールしてください。
# apt-get install gdb
Copyright (C) 2015 ymlib.com