Delphi でビルドした exe の *.dbg ファイルを作った

仕事中に。頼まれた仕事をてきとーにやりながら。いやまあ、この *.dbg ファイル作成というのもそんなに仕事と関係無い訳では無いのだが。デバッグを少しでもし易くするという意味では関係している筈。でも、やっぱり殆ど関係無い作業なんですがね。
Delphi が吐き出す *.map ファイルを元に関数の先頭アドレスと関数名を関連付けた情報を含む *.dbg ファイルを作成しました。それだけです。行番号情報は面倒なのでやっていないというか、行番号情報のフォーマットを詳しく調べていません。行番号情報も入れたい所なんですがねえ…。
今のプロジェクトというのは、*.exe が Delphi 製で *.dll は VC++ 製なんですよ。でまあ、テストマシンが一杯在ってですね、ライセンスの関係上それらのマシンには DelphiVC++ を入れられないという事で、WinDbg を入れているんですね。それで VC++ 製の *.dll は普通に WinDbgデバッグ出来るんですけど、*.exe のデバッグがやり難くて仕方が無かった訳ですよ。という事で、*.dbg ファイルを作ったんです、はい。でも、関数名とその先頭アドレスだけですがね…。これだけですと、関数名の先頭アドレスにブレークポイントを設定出来たり、コールスタックに正しい関数名が表示されたりするんですけど、ソースファイルでトレースしたり出来ないんですよねえ。それが出来ると大きいんですけど。行番号情報…。あー、因みに Delphi の exe のビルド時にはスタックフレームの最適化はしてませんよ、それをしちゃうとコールスタックが滅茶苦茶になってしまいますからね。*.dbg ファイルに FPO 情報を入れれば良いんですけど、そんなのやってられませんからね。
でもさあ、行番号情報が入ったとしても、所詮は行番号情報ですよ。グローバル変数やローカル変数、それに型情報とかは無いんです。トレースは出来るけど一切変数の値が見れないなんて、そんなの寂しいじゃ無いかというかなんつーか。頑張ってそこまでやる必要は無いかなあと思っています。
マップファイルには行番号情報は有りますけど、型情報とかは無いですからね。型情報や変数の情報まで入れるとなると、自分でコンパイルする必要が出て来ます。流石にそんな事はしません。
あー、すみません。正しくは *.dbg ファイルを作ったのでは無くて、*.dbg を生成する Perl スクリプトを書いたんです、はい。態々バイナリエディタで *.dbg ファイルを作るなんて事はしません、それは流石に馬鹿でしょう。ちょっと exe に修正を加えてリビルドしたりしたら、また作り直さなくてはなりませんもんね、そんな事したら。