web-dev-qa-db-ja.com

Visual Studio C ++プロジェクトで/ Ziと/ Z7を使用することの意味は何ですか?

バックグラウンド

いくつかの異なる デバッグフラグ Visual Studio C++コンパイラで使用できます。彼らです:

  • (なし)
    • デバッグ情報を作成しない
    • コンパイル時間が短縮
  • / Z7
    • CodeView形式を使用して、.objファイルに完全なシンボリックデバッグ情報を生成します
  • / Zi
    • プログラムデータベース形式を使用して、ターゲットの.pdbファイルに完全なシンボリックデバッグ情報を生成します。
    • 最小限の再構築(/ Gm)のサポートを有効にし、再コンパイルに必要な時間を短縮できます。
  • / ZI
    • Edit-and-Continueのサポートを除いて、/ Ziのようなデバッグ情報を生成します

問題点

  • / Gmフラグは 複数プロセスビルドの/ MPフラグ (Visual Studio 2005/2008)と互換性がありません

  • 最小限の再構築を有効にする場合は、/ Z7フラグの上に/ Ziフラグが必要です。

  • / MPフラグを使用する場合、MSDNを見ると/ Z7と/ Ziの間に違いはないようです。ただし、 SConsドキュメント は、並列ビルドをサポートするには/ Z7を使用する必要があると述べています。

質問

  • Visual Studio C++プロジェクトで/ Ziと/ Z7を使用することの意味は何ですか?

  • 私が見逃したこれらのオプションのいずれかについて、他の長所または短所はありますか?

  • 具体的には、ターゲット用の単一のプログラムデータベース形式(PDB)ファイルと、ソースごとの複数のCodeView形式(.obj)ファイルの利点は何ですか?

参考文献

MDSN/Z7、/ Zi、/ ZI(デバッグ情報フォ​​ーマット)

MSDN/MP(複数のプロセスでビルド)

SCons構築変数CCPDBFLAG

デバッグ情報

37
Zach Burlingame

Codeviewは、1980年代半ばの「MicrosoftCコンパイラ」の時代にMicrosoftの古いスタンドアロンデバッガで導入されたはるかに古いデバッグ形式です。ディスク上でより多くのスペースを占有し、デバッガーが解析するのに時間がかかり、リンク中に処理するのは大きな苦痛です。 1998年から2000年にCodeWarriorfor Windowsで作業していたときに、コンパイラから生成しました。

1つの利点は、Codeviewが文書化された形式であり、他のツールがPDB形式のデバッグデータベースを処理できない場合にそれを処理できることです。また、一度に複数のファイルをビルドする場合、プロジェクトのデバッグデータベースに書き込むための競合はありません。ただし、最近のほとんどの用途では、PDB形式を使用することは、ビルド時と特にデバッガーの起動時の両方で大きなメリットがあります。

8
Ben Combee

古いC7形式の利点の1つは、個別のPDBとEXEではなく、オールインワンでEXEに保存されることです。これは、ミスマッチが発生することは決してないことを意味します。 VS開発ツールは、PDBが使用する前にそのEXEと一致することを確認しますが、必要なものすべてを備えた単一のEXEを使用する方が間違いなく簡単です。

これにより、リリース時にデバッグ情報を削除できるようにする必要があるという新しい問題と、巨大なEXEファイルが追加されます。もちろん、古い形式やminrebuildなどの他の最新機能のサポートの欠如もありますが、それでも、物事をできるだけシンプルに保つように努めています。 1つのファイルは2つよりも簡単です。

私がC7形式を使用したことはありませんが、あなたが求めているので、私はこれを可能な利点としてそこに置いています。

ちなみに、これは私が使用しているいくつかのプラットフォームでGCCが行う方法です。 DWARF2フォーマットは出力ELFに埋め込まれています。 Unixの人々は彼らがとても陽気だと思っています。 :)

ところで、PDB形式は DIA SDK を使用して解析できます。

7
scobi

/ Z7にはもう1つの欠点があります。それは、インクリメンタルリンクと互換性がないため、それを回避する理由になる可能性があります。リンク: http://msdn.Microsoft.com/en-us/library/4khtbfyf%28v=vs.100%29.aspx

ちなみに、Microsoftは「/ Yu/Z7オプションでコンパイルされたオブジェクトが変更された」ときに(インクリメンタルではなく)フルリンクが実行されると言っていますが、これは/でビルドされた静的ライブラリにのみ当てはまるようです。 Z7、オブジェクトファイル用ではありません。

3
ElektroKraut

/ Z7のもう1つの欠点は、オブジェクトファイルのサイズが大きいことです。これについてはすでにここで説明しましたが、リンカーまたはPE形式のサイズ制限に違反しているためにリンカーが実行可能ファイルをリンクできなくなるまでエスカレートする可能性があります(リンカーエラーLNK1248が発生します)。 Visual StudioまたはPE形式には2GBのハード制限があるようです(x64マシンでも)。デバッグバージョンをビルドするときに、この制限に遭遇する可能性があります。これは、最終的にコンパイルされた実行可能ファイルのサイズだけでなく、一時データにも影響を与えるようです。リンカーの内部について知っているのはMicrosoftだけですが、ここでこの問題が発生しました(ただし、実行可能ファイルは、デバッグ中でも2ギガの大きさではありませんでした)。プロジェクトを/ ZIに切り替えたとき、問題は奇跡的に消え、二度と戻ってこなかった。

1
user5184660

/Z7はデバッグ情報をCodeView形式の.objファイルに保持し、リンカーがそれらを.pdbに抽出できるようにし、/Ziはコンパイル中にmspdbsrv.exeと同期する共通の.pdbファイルに統合します。既に。

したがって、/Z7は、これらのobjファイルに重複するデバッグ情報が多数あるため、より多くのファイルIO、使用されるディスクスペース、およびリンカーのより多くの作業を意味します。しかし、それはまた、すべてのコンパイルが独立していることを意味し、したがって、十分な並列化があれば、実際には/Ziよりも高速である可能性があります。

これまでに、mspdbsrv.exeとのプロセス間通信を減らすことで、/Ziの状況を改善しました: https://docs.Microsoft.com/en-us/cpp/build/reference/ zf

/Z7のもう1つの使用例は、必要に応じて個別の.pdbを出荷する必要のない「スタンドアロン」(ただし、より大きな)静的ライブラリです。それはまた、適切な https://docs.Microsoft.com/en-us/cpp)で修正しない限り、clが使用するひどいデフォルトvcxxx.pdbから生じる厄介な問題を防ぎます。/build/reference/fd-program-database-file-name 、これはほとんどの人が忘れています。

/ZI/Ziに似ていますが、編集と続行機能を機能させるためにデータなどを追加します。

1
Trass3r