たとえば、この情報を例外に追加するために、Windows で backtrace ユーティリティのアナログを実装したいと考えています。
リターン アドレスを取得し、それをシンボル名に変換する必要があります。
私は StackWalk64 とStackWalker プロジェクトを認識していますが、残念ながらいくつかの重要な欠点があります。
- それは非常に遅いことが知られています (StackWalk64) トレースを収集するために多くの時間を無駄にしたくありません。基本的にはリンクされたリストを歩くのと同じくらい速く実行できます。
- 関数 StackWalk64 は、スレッドセーフではないことが知られています。
x86 および可能な x86_64 アーキテクチャのみをサポートしたい
私が持っている基本的な考え方は次のとおりです。
- esp/ebp レジスタを使用して、スタックの一番下に到達するまで GCC の
__builtin_return_address(x)
/と同様にスタック上で実行し__builtin_frame_address(x)
ます (これは glibc が行うことです)。 - アドレスをシンボルに変換する
- それらを分解します。
問題/質問:
- スタックの to に到達したことをどのように知ることができますか? たとえば、glibc の実装には次の機能が
__libc_stack_end
あるため、どこで停止するかを簡単に見つけることができます。Windowsの下でそのようなことの類似物はありますか? スタック ボトム アドレスを取得するにはどうすればよいですか? - dladdr 機能の類似物は何ですか。これで、ほとんどのシンボル名を保持する ELF プラットフォームとは異なり、PE 形式は保持しないことがわかりました。したがって、何らかの形でデバッグ情報を読み取る必要があります。何か案は?