2

動的にリンクするクライアントアプリケーションで使用するために、動的ライブラリ(Windows DLLやLinux共有オブジェクトファイル、.so)をデバッグモードでコンパイルしたとします。私のソースコードは、クライアントアプリケーション開発者が利用できます。

次のデバッグシナリオに関して、いくつかの説明が必要です。私は常に、クライアントアプリケーションがライブラリにデバッグするために(たとえば、クライアントアプリケーション開発者がデバッグ中にソースコードにステップインするために、たとえばで使用するためF10MS VC++)、実際に持っている必要があることを理解/想定していましたライブラリ自体のローカルコピーを作成したか(ソースコードにアクセスできる)、少なくとも作成せずにソースコードにローカルアクセスできます(それで十分かどうかはわかりません)。

私はこれで正しいですか?つまり、クライアントアプリケーションが、それ自体が動的に構築されたアプリケーションに動的にリンクしている場合は、ライブラリにデバッグシンボル(MS VC ++のPDBファイル)を提供するだけでは不十分だと思います。誰かが私のためにこれを整理するのを手伝ってくれるかどうか感謝しますか?Linuxの状況はどうですか?私の理解も上記と同じです。ここで、静的ライブラリ(Windows LIBおよび/またはLinuxライブラリ.a)をコンパイルした場合。私の理解では、彼らは私のソースコードのローカルビルドコピーを持っている必要はありません(私はまだこれを試していません)?

私の前提は正しいですか?そうでない場合は、誰かが親切にいくつかの詳細な説明をできれば例を挙げて提供できますか?ご入力いただきありがとうございます。

4

2 に答える 2

2

私はLinuxよりもWindowsの経験が豊富です。しかし、コンセプトは似ていると思います。

クライアントアプリケーションが、それ自体が動的に構築されたアプリケーションに動的にリンクしている場合。

「動的に構築する」ことを理解しているかどうかはよくわかりません。dllの動的な側面と混同される可能性がありますか?dllは実行時に(ビルド時ではなく)リンクされ、完全なアプリなしでコンポーネントの一部をデプロイできるようにします。たとえば、OSによって提供されるdllに依存するWindows上のアプリは、インターフェイスが維持されている限り、Windowsがそのdllを更新しても影響を受けません。dllとexeの唯一の違いは、dllのエントリ関数がexeのmainではなくdllmainであるということです。

(私が考えることができる唯一の「動的ビルド」の概念は、テンプレート化されたクラスをビルドすることです。しかし、それがここでの意味ではないと思います。)

したがって、.dllのデバッグは.exeのデバッグと同じです。それは、.dllが実行可能ファイルとは別のバイナリファイルであるということだけです。すべてのソースコードが提供するのは、デバッガーがステップをソースコードの行に合わせることができるようにすることです。ソースコードが利用できない場合でも、デバッガーはシンボルを使用してアセンブリコードをステップ実行できます。

状況が許せない場合は、アセンブリコードの読み取りが得意な開発者は、シンボルのみを使用してデバッグを実行でき、ソースコードは使用できません。

通常、最適化されたオプションを使用してバイナリを構築できます。その後、コンパイラがアセンブリコードを最適化して、デバッガでのソースコードの調整が不可能になる場合があります。これは通常、リリースされたコードで発生します。このような場合、コードをステップ実行すると、予想とは一見異なる行または条件のジャンプが表示されることがあります。.exe、libsを含む.exe、または.dllにも同じことがあります。これがおそらく、dllをデバッグするために独自のバイナリを構築することが常に必要であると考えた理由ですか?

于 2012-07-06T06:19:48.540 に答える
2

リクエストに応じて、これが私のコメントです。これはWindows側のみを対象としているため、回答にLinux(またはMac!)の部分がある場合は、自由に編集できます(これをコミュニティwikiの回答としてマークしました)。


VC ++の場合、必要なのはデバッグビルドDLL+一致するPDB+一致するソースだけです。難しいのは、それらすべてを一致させることです;-)

また、ソースファイルがDLLのコンパイル時と同じパスにある場合はよりスムーズに機能しますが、Visual Studioには、ソースがある場合は手動でソースを参照するように求めるプロンプトも表示されます。

于 2012-07-06T17:35:02.213 に答える