3

一部の Delphi 2009 コードから呼び出される、ネイティブ エクスポートを備えた C# DLLがあります。Delphi コードはLoadLibrary、 とを使用しGetProcAddressて、エクスポートされた関数にアクセスします。実行時にコードのマネージ部分をデバッグしたいのですが、問題が発生しています。

アプリケーションを起動すると、ブレークポイントは正しく表示されますが、ヒットしません。

私の現在の設定は次のとおりです。

  • Visual Studio 2010 の C# DLL プロジェクト
  • プロジェクトのデバッグ設定を「外部プログラムの開始」に設定し、Delphi 実行可能ファイルを指定します。
  • アンマネージ コードのデバッグを有効にすると、オフになります。
  • デバッグオプションでマイコードのみが有効になっています(これは違いがないようです)

アンマネージ コードのデバッグを有効にしようとしましたが、「バイナリはデバッグ情報なしでビルドされました」というエラーが発生します。続行すると、すべてのブレークポイントが無効になります。

モジュール リストを確認すると、実行可能ファイルにはデバッグ シンボルが含まれていません。Delphi は PDB を生成しませんが (クローズド スペックの独自フォーマットであるため生成できません)、代わりに MAP ファイルを生成します。MAP から PDB へのコンバーター ツールを探してみましたが、必要なものの逆を行うためのツールしかないようです。

Visual Studio から Delphi コードをデバッグすることにはあまり興味がありません。CodeGear Delphi IDE で既に実行できるためですが、この状況で実行時にマネージ コードをデバッグする方法はありますか?

4

2 に答える 2

4

わかりました、解決策を見つけました。問題はデバッグ シンボルではなく、デバッグされるコードの種類にありました。プロジェクトのスタートアップ設定からアプリケーションを起動すると、デバッガーは混合モードで起動します。これには、ネイティブ コードから呼び出された C# コードをキャッチするために、ネイティブ シンボルを使用できる必要があります。

tds2dbgによって作成された pdb ファイルを Visual Studio で受け入れることができなかったため、回避策を見つけました。デバッガーがマネージド モードで確実に起動するようにするには、プロセスを起動する代わりに、次のようにプロセスにアタッチします。

  1. デバッグ -> プロセスにアタッチ...
  2. 実行中のプロセスを選択します。
  3. 「添付先」の右側にある「選択...」ボタンをクリックします。
  4. 「これらのコードの種類をデバッグする」を選択します
  5. .NET 3.5 以下の場合は [マネージド (v2.0、v1.1、v1.0)]、.NET 4.0 以降の場合は [マネージド (v4.0)] にチェックを入れます。ここで v3.5 が名前から除外されている理由がわかりません。
  6. [OK] をクリックし、[添付] をクリックします。

この後、すべてのブレークポイントがうまく機能するはずです:)

于 2012-06-26T12:37:51.597 に答える
1

.pdb ファイルを作成できる「tds2pdb」があります: http://code.google.com/p/map2dbg/downloads/detail?name=tds2pdb102.zip

注: これは完全な .pdb ファイルではありません (仕様は入手できません) が、少なくともスタック トレースに対しては機能しています。ただし、すべてのシンボル (クラス、変数、パラメーター) がエクスポートされるわけではありません。しかし、いつでも試すことができます...

于 2012-06-26T10:12:08.750 に答える