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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。