私の目標は:
- Delphiでコンパイルされた32ビットまたは64ビットのWindowsプログラムで中断されたスレッドを指定して、スタックをウォークする(実行可能)
- スタックエントリを指定して、各メソッドのローカル変数とその値を列挙します。つまり、少なくとも、それらのアドレスとタイプ(integer32 / 64 / signed / unsigned、string、float、record、class ...)を見つけ、それらの組み合わせを使用して値を見つけることができます。
1つ目は問題ありませんが、この質問に関する2つ目です。高レベルで、Delphiのスタックエントリを指定してローカル変数をどのように列挙しますか?
低レベルでは、これは私が調査してきたものです:
RTTI:メソッドに関するこの種の情報はリストしません。これは、私が実際に現実的な選択肢であると思ったものではありませんでしたが、とにかくここにリストします。
デバッグ情報:デバッグビルド用に生成されたデバッグ情報をロードします。
- マップファイル:詳細なマップファイル(テキスト形式のファイルです。ファイルを開いて確認してください)にも、ローカル変数情報は含まれていません。基本的には、アドレスとソースファイルの行番号のリストです。アドレスとファイルの行の関連付けに最適です。たとえば、樋の青いドットです。より詳細な情報には不向き
- リモートデバッグ情報(RSMファイル)- その内容や形式に関する既知の情報はありません。
- TD32 / TDSファイル:現在の研究内容。それらは他の多くの情報の中でグローバルとローカルのシンボルを含んでいます。
ここで遭遇する問題は次のとおりです。
- TD32ファイル形式のドキュメントはありません(見つけられます)。
- それらに関する私の知識のほとんどは、それらを使用するJedi JCLコード(JclTD32.pas)からのものであり、そのコードの使用方法や、ローカル変数を表示するのに十分な構造があるかどうかはわかりません。私はそれがグローバルシンボルを処理することを確信していますが、ローカルについては非常に不確かです。多種多様な定数が定義されており、形式に関するドキュメントはありません。それらが何を意味するかを読むために、私は推測しておきます。ただし、これらの定数とその名前はどこかに由来している必要があります。
- TDS情報を使用して見つけることができるソースは、ローカルシンボルをロードまたは処理しません。
これが正しいアプローチである場合、この質問は「TDS / TD32ファイル形式のドキュメントはありますか?ローカル変数をロードするコードサンプルはありますか?」
コードサンプルは必須ではありませんが、最小限の場合でも非常に便利です。