Armadilloフォーラム

プログラム異常終了

yoshioka-rogu

2016年2月17日 17時06分

お世話になっております。吉岡と申します。
Armadillo420でプログラムが異常終了する原因を調べているのですが原因がわからず困っております。

環境 Armadillo420 atmark-dist-20140415 linux-2.6.26-at19

printfを入れて確認してみたのですが
最後に出力されているのはsystem または popen関数(pcloseは確認)を呼んだ後に終了していると思われます。

system、popen関数で行っている内容としては
 ping -c 3 (IP)、 route、 pppd等
 を行っていますが
 pingコマンドで終了するのが大半(使用頻度が最も多いせいなのか?)
 

過去のトピックでcoreファイルを作成するデバック方法があったので確認してみたのですが

$ arm-linux-gnueabi-gdb datamail -c core.2642 GNU gdb 6.8-debian
Copyright (C) 2008 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 copying"
and "show warranty" for details.
This GDB was configured as "--host=i486-linux-gnu --target=arm-linux-gnueabi"...
 
warning: exec file is newer than core file.
Reading symbols from /usr/arm-linux-gnueabi/lib/libpthread.so.0...done.
Loaded symbols for /usr/arm-linux-gnueabi/lib/libpthread.so.0
Reading symbols from /usr/arm-linux-gnueabi/lib/libc.so.6...done.
Loaded symbols for /usr/arm-linux-gnueabi/lib/libc.so.6
Reading symbols from /usr/arm-linux-gnueabi/lib/ld-linux.so.3...done.
Loaded symbols for /usr/arm-linux-gnueabi/lib/ld-linux.so.3
Reading symbols from /usr/arm-linux-gnueabi/lib/libnss_files.so.2...done.
Loaded symbols for /usr/arm-linux-gnueabi/lib/libnss_files.so.2
Reading symbols from /usr/arm-linux-gnueabi/lib/libnss_dns.so.2...done.
Loaded symbols for /usr/arm-linux-gnueabi/lib/libnss_dns.so.2
Reading symbols from /usr/arm-linux-gnueabi/lib/libresolv.so.2...done.
Loaded symbols for /usr/arm-linux-gnueabi/lib/libresolv.so.2
Core was generated by `datamail -d -c -a -p'.
Program terminated with signal 11, Segmentation fault.
[New process 2665]
[New process 2666]
[New process 2664]
[New process 2663]
[New process 2662]
[New process 2661]
[New process 2660]
[New process 2642]
#0  0x00000078 in ?? ()
(gdb) 

お判りになる方がいらっしゃればご教授お願いします。

コメント

at_yuma.arakawa

2016年2月17日 19時00分

> Core was generated by `datamail -d -c -a -p'.
> Program terminated with signal 11, Segmentation fault.
> [New process 2665]
> [New process 2666]
> [New process 2664]
> [New process 2663]
> [New process 2662]
> [New process 2661]
> [New process 2660]
> [New process 2642]
> #0 0x00000078 in ?? ()
> (gdb)
GDBがcoreファイルを読み込み、デバッグの準備ができた段階であり、
有益な情報をまだ得られていません。

"(gdb)"というプロンプトが出ている状態で、
"bt"(backtrace)コマンドの実行結果を添付してもらえますでしょうか?

GDBでのSegmentation faultのデバッグについては、以下のような記事もありますが、
参考になりますでしょうか。
http://d.hatena.ne.jp/JiaLu/20120113/1330396897

なお、差し支えなければ、現象を再現させられる最小限のソースコードを添付していただけると、
より適切なアドバイスが可能かと思います。

コメントありがとうございます。

> "(gdb)"というプロンプトが出ている状態で、
> "bt"(backtrace)コマンドの実行結果を添付してもらえますでしょうか?

btコマンドの実行結果

Core was generated by `datamail -d -c -a -p'.
Program terminated with signal 11, Segmentation fault.
[New process 2665]
[New process 2666]
[New process 2664]
[New process 2663]
[New process 2662]
[New process 2661]
[New process 2660]
[New process 2642]
#0  0x00000078 in ?? ()
(gdb) bt
#0  0x00000078 in ?? ()
#1  0x00000078 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) frame 0
#0  0x00000078 in ?? ()
(gdb) frame 1
#1  0x00000078 in ?? ()
(gdb) info registers
r0             0x56c41811    1455691793
r1             0x1    1
r2             0x0    0
r3             0x56c41811    1455691793
r4             0x4396b4d8    1133950168
r5             0x4396b490    1133950096
r6             0x40041000    1074008064
r7             0x78    120
r8             0x4002bfa8    1073921960
r9             0x0    0
r10            0x3d0f00    4001536
r11            0x4396b490    1133950096
r12            0x432ec    275180
sp             *value not available*
lr             0x78    120
pc             0x78    0x78
fps            0x0    0
cpsr           0x60000010    1610612752
(gdb) info sharedlibrary
From        To          Syms Read   Shared Object Library
0x40029c90  0x40037398  Yes         /usr/arm-linux-gnueabi/lib/libpthread.so.0
0x40058b70  0x4013f760  Yes         /usr/arm-linux-gnueabi/lib/libc.so.6
0x400007c0  0x40018bbc  Yes         /usr/arm-linux-gnueabi/lib/ld-linux.so.3
0x44196818  0x4419d318  Yes         /usr/arm-linux-gnueabi/lib/libnss_files.so.2
0x441a7acc  0x441a9b08  Yes         /usr/arm-linux-gnueabi/lib/libnss_dns.so.2
0x441b4f80  0x441bf550  Yes         /usr/arm-linux-gnueabi/lib/libresolv.so.2
(gdb) 

と表示されます。
不要かもしれませんがGDBをサイトで調べて
(gdb) info registers
(gdb) info sharedlibrary
の情報も表示してみました

翻訳サイトで(corrupt stack?) (壊れてスタック?)
スタックが壊れた(Stack Overflow?)という事なのでしょうか?

> GDBでのSegmentation faultのデバッグについては、以下のような記事もありますが、
> 参考になりますでしょうか。
> http://d.hatena.ne.jp/JiaLu/20120113/1330396897
参考にしてみます、ありがとうございます。

> なお、差し支えなければ、現象を再現させられる最小限のソースコードを添付していただけると、
> より適切なアドバイスが可能かと思います。
現在複数のthreadが複雑に動いている状態で
現象できる最小限のソースにするには時間がかかると思われますが
関係のないthreadを停止して確認していきたいと思います。

(gdb) bt
#0  0x00000078 in ?? ()
#1  0x00000078 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

symbol が含まれていないようです。compile するときに、-gをつけてください。-O0もつけておくとデバッグしやすいです。

コメントありがとうございます。

> symbol が含まれていないようです。compile するときに、-gをつけてください。-O0もつけておくとデバッグしやすいです。

-gは付けていたのですが
最適化なし-O0は付けていなかったせいでしょうか、
-O0付けてみます。

シンボルは -g があれば問題ありません。-O0は関係ないはずです。
ビルドのログを見せてもらえますか?

-Oはオプティマイズレベルの設定です。レベルが上がると関数が inline 化されたり実行順番の入れ替えなどが発生してデバッグしづらくなります。

コメント、ありがとうございます。

> シンボルは -g があれば問題ありません。-O0は関係ないはずです。
> ビルドのログを見せてもらえますか?

現在-O0が追加になっています。

atmark@atde3:~/atmark-dist-20140415/user/MOBILE-908W002$ make
arm-linux-gnueabi-gcc  -c -g -O0 -Dlinux -D__linux__ -Dunix -DEMBED -Wall -fno-common -o main.o main.c
(途中省略)
arm-linux-gnueabi-gcc  -c -g -O0 -Dlinux -D__linux__ -Dunix -DEMBED -Wall -fno-common -o strsplit.o strsplit.c
arm-linux-gnueabi-gcc    -L../../../atmark-dist-20140415/lib -L/usr/arm-linux-gnueabi/lib -lpthread -o datamail main.o tool.o ttyUFunc.o mailFunc.o pppFunc.o tcpServer.o tcpClient.o mntFunc.o dirFunc.o timeFunc.o msgBox.o ttyLine.o strsplit.o -lc -lgcc 
atmark@atde3:~/atmark-dist-20140415/user/MOBILE-908W002$ 

以上、よろしくお願いいたします。

ビルドした直後のファイルを Armadilloに持っていくと、関数名が表示されませんか?

dist は、 romfsにする場合にバイナリサイズを小さくするために、 stripしてしまいます。
dist で romfs を作成している場合は、 CONFIG_VENDOR_AUTO_STRIPPERを外してください。

コメントありがとうございます。

> ビルドした直後のファイルを Armadilloに持っていくと、関数名が表示されませんか?

VMwareでビルドしたものをUSBメモリーを使用しArmadilloにコピーして試験しております
できたCoreファイルもUSBメモリーでVMwareにコピーしてGDBを行っております。

再現性のある最小限のソースにしながらの試験ですが
本日の異常停止ではcoreファイルも作成されませんでした。

シリアルログでは
「I NKF Convert(20160220-135635.body)」
で停止していたのでEnterキーを押すと
「Segmentation fault」が表示された。

ulimitの設定がされていないのかと思ったが
unlimitedとなっていた

I Erase Body-File(20160220-135627.body)[original].
I Erase Body-File(20160220-135627.body)[base64].
I M30STEP[35] M30CODE[0].
I  name[20160220-135635.body].
I check Body File[OK].
I M30STEP[32] M30CODE[0].
I NKF Convert(20160220-135635.body)
 
[1] + Segmentation fault         datamail -d -c -a -p
[root@armadillo420-0 (ttymxc1) ~]# ulimit -a
time(seconds)        unlimited
file(blocks)         unlimited
data(kbytes)         unlimited
stack(kbytes)        8192
coredump(blocks)     unlimited
memory(kbytes)       unlimited
locked memory(kbytes) 32
process              512
nofiles              1024
vmemory(kbytes)      unlimited
locks                unlimited
[root@armadillo420-0 (ttymxc1) ~]# ps
  PID  Uid     VmSize Stat Command
    1 root        588 S   init
    2 root            SW< [kthreadd]
    3 root            SW< [ksoftirqd/0]
    4 root            SW< [events/0]
    5 root            SW< [khelper]
    6 root            SW< [kblockd/0]
    7 root            SW< [ksuspend_usbd]
    8 root            SW< [khubd]
    9 root            SW< [kmmcd]
   10 root            SW  [pdflush]
   12 root            SW< [kswapd0]
   13 root            SW< [aio/0]
   14 root            SW< [mtdblockd]
   18 root            SW  [pdflush]
   28 root            SW< [mmcqd]
  167 root        388 S < udevd --daemon
  372 root        480 S   syslogd -L
  405 root        360 S   klogd
 1281 www-data   1148 S   lighttpd -f /etc/lighttpd.conf
 1328 avahi      1448 S   avahi-daemon: running [armadillo420-0.local]
 1395 root        928 S   -ash
17919 root        800 S   pppd
17938 root        752 R   ps
[root@armadillo420-0 (ttymxc1) ~]# ls -la
drwxr-xr-x    2 root     root         1024 Feb 19 13:42 ./
drwxr-xr-x   19 root     root         1024 Jan  1  1970 ../
[root@armadillo420-0 (ttymxc1) ~]#

という状態でした

> dist は、 romfsにする場合にバイナリサイズを小さくするために、 stripしてしまいます。
> dist で romfs を作成している場合は、 CONFIG_VENDOR_AUTO_STRIPPERを外してください。

distしたものでは試験は行っていませんが、参考までにお聞きします。
CONFIG_VENDOR_AUTO_STRIPPERを外すというのは
/dist/vendors/AtmarkTechno/Armadillo-420/config.vendor内の
CONFIG_VENDOR_AUTO_STRIPPER=n
とするということでしょうか?

> CONFIG_VENDOR_AUTO_STRIPPERを外すというのは
> /dist/vendors/AtmarkTechno/Armadillo-420/config.vendor内の
> CONFIG_VENDOR_AUTO_STRIPPER=n
> とするということでしょうか?

make menuconfig の方が良いと思います。
http://goo.gl/81qpBF