Android で落ちている箇所の情報を得る@ネイティブ

root 権限が必要ですが

echo 1>/proc/sys/kernel/print-fatal-signals

でカーネルからメッセージが出力され dmesg で情報を見ることができます。
(呼び出し履歴は含まれていない…)

必要となる状況

ネイティブ部分でシグナルハンドラに SIG_DFL など設定済みのハンドラ以外に設定してしまうと
落ちたときに情報が表示されなります。

最初に設定したときに sigaction の 第三引数 oldact で得た設定前の値へ再設定すれば回避できるとおもいますがまだ試せていません。

ユーザー側でハンドラを設定している場合は /system/bin/linker が設定しているハンドラと同じ事を
ユーザー側のハンドラ内で行えば表示されるとおもいます。

通常の流れ

ネイティブ部分(NDK で作成した共有ライブラリ)で落ちた時に
シグナルハンドラを設定しなかった場合は /system/bin/linker が設定したハンドらに制御が移ります。

/system/bin/debuggerd プロセスに対して unix ソケット(android:debuggerd)を使用して
バックトレースなどの情報を取得するようにリクエストを出します。

debuggerd は ptrace を使用して logcat へ情報を出力してます。
(SHARP の端末では ptrace に制限があるため ptrace でエラーとしか表示されません。)

また debuggerd は /data/tombstones に対して tombstone_00 から tombstone_09 までのファイルに対しても情報を出力していますが、system:system の 600 でファイルを作成するため root でないと読み出せないと思います。

This entry was posted in Android, Android kernel, Android NDK, Linux, Linux kernel. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>