電話(Android)が予期せず再起動したときに、誰が *sys_reboot* を呼び出したのか知りたいです。
syscall (Android カーネル)でコール スタックをダンプする方法はありますか?
電話(Android)が予期せず再起動したときに、誰が *sys_reboot* を呼び出したのか知りたいです。
syscall (Android カーネル)でコール スタックをダンプする方法はありますか?
カーネルコール トレースだけが必要な場合は、dump_stack()
. panic()
とりわけ、それを呼び出します。BUG()
/BUG_ON()
ラッパーは、より説明的なメッセージとオプションの条件テストを提供します。
ただし、ユーザーランドのスタックトレース、特にシンボリックなものは、カーネル内から直接確実に取得することはできません。スタック メモリをカーネル空間にコピーして内容をログに記録したり、フレームポインタが最適化されていない場合はヒューリスティックにウォークSP
/FP
リンクすることもできますが、シンボルを解決するには、ELF 情報にアクセスして解析する必要があります。純粋なカーネル側の実装としてそれを行った人がいるかどうかはわかりません。より簡単な解決策は、システムコールフックからプログラムを停止し、それに接続するユーザー空間デバッガーを生成し、スタックトレースを抽出し、完了したらプログラムを続行することです。
これを行う方法については、この SO 投稿call_usermodehelper / call_usermodehelperpipe の使用法を参照してください。
この SO 投稿も参照してください:同じ質問への別の参照については、Linux カーネル空間でユーザー空間のスタック トレースを印刷する方法。