4

私のアプリのスレッドのいくつかは最適化された関数にあり、アプリをデバッグすると、gdbはそれらの関数からバックトレースできません。しかし、私はアセンブラーを見てきましたが、次のようなことを行うことで、前の関数のフレームまで手作業でスタックを部分的に巻き戻すことができます。

set $old_ra = $ra
set $old_sp = $sp
set $ra = *(unsigned long*)($sp+28)
set $sp = $sp + 48
bt
set $ra = $old_ra
set $sp = $old_sp

これは、ライブデバッグを行っている場合は完全に機能し、完全なバックトレースを正常に表示します。コアダンプを見るときに、同じことをオフラインで実行できるようにしたいと思います。明らかに、レジスタを突くという概念はコアダンプでは無意味ですが、同様のバックトレースを実行できるように、gdbに「レジスタにこの値を使用する」ように指示する方法はありますか?

4

1 に答える 1

3

箱から出していない。私が見つけた唯一の方法は、コアファイルを物理的に変更することです。ELFコアファイルには通常、プロセスレジスタを含む1つ以上の「reg」セクションがあります。必要なのは、そのセクションのどこに変更するレジスタがあるかを正確に把握してから、ファイルを編集し、そこに新しい値を配置して、GDBを再実行することです。

于 2011-12-01T01:24:44.483 に答える