14

パッケージとコンポーネントを使用するアプリケーションを構築しました。アプリケーションをデバッグするとき、IDEの「イベントログ」には、デバッグ情報なしでBPLがロードされていることが示されることがよくあります(「デバッグ情報なし」)。すべてのパッケージとEXEはデバッグで構築されているため、これは意味がありません。

_(each project) | Options | Compiling_
[ x ] Assertions
[ x ] Debug information
[ x ] Local symbols
Symbol reference info = "Reference info"
[   ] Use debug .dcus
[ x ] Use imported data references

_(each project) | Options | Linking_
[ x ] Debug information
Map file = Detailed

4つのプロジェクトがあり、すべてランタイムパッケージで構築されています。

  1. Core.bpl
  2. Components.bpl
  3. Plugin.bpl(#1と#2の両方を使用)
  4. MainApp.exe(#1を使用)

観察された問題

1)デバッグするとき、多くの場合、Components.bplにはデバッグ情報がロードされますが、[ローカル変数]ウィンドウのすべての値が空白になります。コード内の変数の上にマウスを置くと、ポップアップは表示されず、[評価]ウィンドウにも何も表示されません([結果]ペインは常に空白です)。

2)さまざまなBPLのイベントログに「デバッグ情報なし」と表示されることがあります。たとえば、Plugin.bplプロジェクトをアクティブにして、Run | パラメータのホストアプリケーションをMainApp.exeにして、F9キーを押すと、Plugin.bplモジュールを除くすべてのモジュールが「デバッグ情報あり」でロードされているように見えます。ロードすると、イベントログに「デバッグ情報なし」と表示されます。ただし、アプリを閉じてすぐにF9キーを押すと、何も再コンパイルせずにアプリが再度実行され、今回はPlugin.bplにデバッグが読み込まれます(「デバッグ情報があります」)。

質問

1)「ローカル変数」ウィンドウに値が表示されない原因は何ですか?

2)BPLがデバッグに準拠していて、すべてのデバッグファイル(dcu、mapなど)が使用可能な場合、BPLがデバッグ情報なしでロードされることがあるのはなぜですか?

4

7 に答える 7

5

私はそれに関する私の問題を説明します。

関数を使用してパッケージを動的にロードしLoadPackageます。

SysInternals.com Process Monitorそのpackagename.DCPが開いて、処理後に正常に読み取られたことがわかりLoadPackageます。ファイルI / Oが失敗したり、間違った場所でファイルを見つけようとしたり、疑わしいことはありません。したがって、おそらくDCPには、IDEデバッガーを混乱させる構造がいくつかあります。私Turbo DebuggerはDelphiで利用可能だった時代を待ち望んでいます。

ところで、開発者がそのようなものを作成した場合、packagename.RSMについても同じです。

次に(ブレークポイントまたはステップトレースで一時停止している間)、[ウィンドウの表示/デバッグ] / [モジュール]を開いて、最後のモジュールが私のものであることを確認します。空の「シンボル情報」セルがあります。それを右クリックして、「シンボルの再ロード」アクションを選択します。これで、これからデバッグできます。

PS。それでも初期化セクションのデバッグに役立つのであれば、Dunno-うまくいけば" break on load"メニュー項目は動的LoadPackage呼び出しでも機能します...

PPS。IDEを再起動しても、実際に機能します。だから今私はBPLの読み込みで警告されますCPU View、私はストライクしCTRL+ALT+M、下にスクロールして私のBPLを見つけ、r-クリックしてReload SymbolsEnterを押し、次に閉じModulesCPUビューとストライクしF9 (Run)ます。セクションが完了した後initialization、私は再び警告を受けますCPU View-終了するほんの数JMP秒前にLoadPackage-それで私は閉じてもう一度CPU ViewストライクF9します。かなり退屈ですが、IDEの再起動よりも優れています。

于 2012-10-03T11:23:17.763 に答える
4

私たちのプロジェクトでも同様の問題が発生しました。残念ながら、数十のbplがあるため、それらを1つにマージすることはできません。この問題は、XE2に移行し、コンパイルターゲットのフォルダー構造を変更した後に発生しました。新しいバージョンのDelphiで問題が発生したかどうかを判断するのは困難ですが、パス環境変数にbplsがコンパイルされるフォルダーを追加することで問題を修正できます。IDEのパスオーバーライド機能を使用します。このタイプの構成は、Delphi2010では必要ありませんでした...

于 2012-08-13T01:34:35.973 に答える
4

この非公式ツールは、Delphiの多くの問題を修正します。デバッグ情報なしでモジュールのロードを修正しました。magicandre1981へのすべてのクレジット 。

于 2014-06-04T01:48:51.883 に答える
2

この問題はQC#109291に関連している可能性があります。

Delphi IDEが.dprojファイルの導入を開始し、オプションセットを使用して構成をビルドすると、プロジェクトのリリース管理が大幅に改善されます。

ただし、再生やキャッチが難しい副作用もあり、IDEのバグだと思いました。この問題は、一部のプロジェクトがIDEデバッガーでデバッグできないユーザーを常に混乱させるはずです。プロジェクトのコンパイラとリンクオプションに関連するすべての設定を確認しても、プロジェクトでデバッガがアクティブになりません。一部のプロジェクトは機能し、一部のプロジェクトは機能しません。私たちは、メモリの問題またはCPUの問題であるとさえ考えています。

この問題は、.dprojファイルの設定に正しい情報が保存されていないことが原因であることに気付きました。関連する.dprojファイルに次のようなものがある場合:

<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
    <Cfg_1>true</Cfg_1>
    <CfgParent>Base</CfgParent>
    <Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
    <Cfg_2>true</Cfg_2>
    <CfgParent>Base</CfgParent>
    <Base>true</Base>
</PropertyGroup>

<Import Project="Release.optset" Condition="'$(Cfg_2)'!='' And Exists('Release.optset')"/>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
    <CfgDependentOn>Release.optset</CfgDependentOn>
</PropertyGroup>
<Import Project="Debug.optset" Condition="'$(Cfg_1)'!='' And Exists('Debug.optset')"/>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
    <CfgDependentOn>Debug.optset</CfgDependentOn>
</PropertyGroup>

Release.optsetバインド先Cfg_2Debug.optsetバインド先Cfg_1ですが、構成Releaseはを使用してCfg_1おり、Debug構成はを使用していますCfg_2

プロジェクトをビルドするとき、デバッグ情報はデバッグ構成では生成されませんが、リリース構成では生成されます。

回避策は、Delphi IDEではなく任意のテキストエディタで.dprojを開き、次のように更新することです。

<Import Project="Release.optset" Condition="'$(Cfg_1)'!='' And Exists('Release.optset')"/>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
    <CfgDependentOn>Release.optset</CfgDependentOn>
</PropertyGroup>
<Import Project="Debug.optset" Condition="'$(Cfg_2)'!='' And Exists('Debug.optset')"/>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
    <CfgDependentOn>Debug.optset</CfgDependentOn>
</PropertyGroup>
于 2012-10-05T09:37:48.223 に答える
2

デバッグ情報を使用して個別のパッケージをビルドする必要があり、最終的にはデバッグなしでそれらをビルドする必要があります。したがって、両方が2つの場所にあります。次に、デバッグ情報を使用してアプリプロジェクトをビルドします。パスをチェックして、デバッグが有効なパッケージソースがデバッグプロジェクトビルドに含まれていることを確認します。間違ったソースからインクルードしているため、デバッグなしでビルドされたパッケージをインクルードしているようです。両方のパスが含まれていないことを確認する必要があります。Delphiは、2つの場所で同じパッケージが見つかった場合に何を含めるかを選択します。

于 2012-01-09T19:44:08.300 に答える
2

特定の状況では、Core.pblとComponents.bplを1つのBPLに結合することで問題を修正することができました。これで、すべてのモジュールにデバッグ情報がロードされ、ローカルウィンドウに変数の値が表示されないという問題が解決されました。

于 2012-01-11T08:01:16.563 に答える
0

.dprjファイルで、falseに設定された値Debugger_LoadAllSymbolsを持つCfg_2détailsの1行を見つけました。私はそれをtrueに設定しました。問題が解決しました。おそらくあなたの場合とは似ていませんが、役立つかもしれません。

<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
...
    <Debugger_LoadAllSymbols>true</Debugger_LoadAllSymbols>
...
</PropertyGroup>
于 2013-08-13T09:13:39.007 に答える