まず、問題があります。 私はいくつかのフリー プロジェクトを持っていますが、どのソフトウェアにもバグが含まれています。バグに遭遇したときに、スタックトレースを含むバグレポートを送ってくれる仲間のユーザーもいます。障害の場所を簡単に見つけるために、このスタック トレースの行番号を確認したいと考えています。アプリケーションが .pdb ファイルなしで出荷された場合、すべての行情報が失われるため、現在、すべてのプロジェクトが .pdb ファイルでデプロイされているため、生成されたスタック トレースにはこの番号が含まれます。しかし!しかし、私はこのファイルをディストリビューションで見たくないので、すべての .pdb を削除したいと考えています。ユーザーを混乱させたり、インストーラーのスペースを消費したりします。
Delphi ソリューション: 昔、私が Delphi プログラマーだったとき、次の手法を使用していました。例外が発生した場合、アプリケーションはスタック上を歩き、アドレスを収集します。次に、バグ レポートを受け取ったときに、収集したアドレスと、MY マシンにある対応するシンボル ファイルに基づいて、関数名と行番号を使用して有効なスタック トレースを再構築するツールを使用しました。
質問: .NET で同じことを行うための lib やテクニックなどはありますか?
ステータスの更新:非常に興味深いことです。多くの場合、質問をすることが独自の調査を開始するための最良の方法です。たとえば、私はこの問題についてしばらく考えていましたが、数日前に答えを探し始めました。
オプション 1: MiniDumps。多くのグーグル検索の後、コードからミニ ダンプを作成する方法と、マネージド ミニ ダンプからスタックを再作成する方法を見つけました。
- ミニ ダンプ フォーム コードを作成するための再頒布可能アセンブリ - clrdump
- 以前のアセンブリの使用に関するブログ投稿 - .NET 運用アプリケーションでのミニダンプの作成と分析
ただし、このソリューションでは、2 つの追加アセンブリ (サイズが最大 1 MB) を再配布する必要があり、ミニ ダンプにはある程度のスペースが必要であり、ユーザーがそれらを電子メールで送信するのは不快です。したがって、私の目的からすると、現時点では受け入れられません。
オプション 2: 手がかりをくれた weiqure に感謝します。スタック フレームごとにマネージド IL オフセットを抽出できます。問題は、このオフセットに基づいて .pdb から行番号を取得する方法です。そして、私が見つけたもの:
- PDB ファイルの内部、参考までに:
- ISymbolReader - プログラム データベース ファイルを読み取るためのマネージド インターフェイス
- 最後に、.pdb ファイルを構造化 xml に変換してxpath 処理を容易にするツール
このツールを使用すると、リリース ビルドごとに xml ファイルを作成し、それらをリポジトリに配置できます。ユーザーのマシンで例外が発生した場合、IL オフセットを使用してフォーマットされたエラー メッセージを作成できます。次に、ユーザーはこのメッセージ (非常に小さい) をメールで送信します。最後に、フォーマットされたエラー メッセージから結果のスタックを再作成する簡単なツールを作成することができます。
なぜ誰もこのようなツールを実装しないのだろうか? これが私だけにとって興味深いものだとは思いません。