2011/05/04

logcatに出てくるSIGSEGVからソースファイルを割り出す

KMC Staff Blog:Androidのデバッグダンプからソース上の問題発生箇所を調べる方法

実践してみよう。

まず、スタックトレースから。

I/DEBUG   (  741):          #00  pc 00015ca4  /system/lib/libc.so
I/DEBUG   (  741):          #01  pc 0000143a  /system/lib/liblog.so
I/DEBUG   (  741):          #02  pc 0000bb7e  /system/lib/libstagefright_omx.so
I/DEBUG   (  741):          #03  pc 0000bbe2  /system/lib/libstagefright_omx.so
I/DEBUG   (  741):          #04  pc 0000be5c  /system/lib/libstagefright_omx.so
I/DEBUG   (  741):          #05  pc 0000a446  /system/lib/libstagefright_omx.so
I/DEBUG   (  741):          #06  pc 000167b8  /system/lib/libmediaplayerservice.so
I/DEBUG   (  741):          #07  pc 00059aba  /system/lib/libstagefright.so
I/DEBUG   (  741):          #08  pc 0004a3ee  /system/lib/libstagefright.so
I/DEBUG   (  741):          #09  pc 00018cfc  /system/lib/libmediaplayerservice.so
I/DEBUG   (  741):          #10  pc 00014be4  /system/lib/libmediaplayerservice.so
I/DEBUG   (  741):          #11  pc 00015570  /system/lib/libmediaplayerservice.so



libcとかliblogとか見ても仕方ないので、その次のlibstagefright_omx.soに着目。
アドレスは0x0000bb7e。

シンボルつきのオブジェクトは、out/target/product/xxxx/symbols以下にあるとのこと。
この情報が重要だ。
リンク先ではobjdumpを使用しているけど、私はソースファイルの場所が知りたいのでaddr2lineを使う。

$ addr2line -e symbols/system/lib/libstagefright_omx.so 0x0000bb7e
/home/...../frameworks/base/media/libstagefright/omx/OMXMaster.cpp:90

のように、ソースファイルの行数が出てくる。
そこを見ると、こんなのがあった。

    CHECK_EQ(err, OMX_ErrorNoMore);


なんかそれっぽいログがその直前に出ていたな。。。

F/OMXMaster(  744): frameworks/base/media/libstagefright/omx/OMXMaster.cpp:90 err != OMX_ErrorNoMore

ああ、これこれ。
CHECK_EQをたどっていくと、__builtin_trapで途切れてしまった。
たぶん、linuxかgccのトラップ処理かなにかで、assert()ぽい動きをするのだろう。

そんなわけで、addr2lineを使わなくてもログでわかったんだけど、このログがSEGVに直結していることが確認できてよかった。
logcatの「F/」で始まるログはFATALのFで、そのままSIGSEGVで落ちてしまうと考えて良さそうだ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。