共用方式為


/Z7、、 /Zi/ZI (偵錯資訊格式)

/Z7/Zi/ZI 編譯程式選項會指定為程式建立的偵錯資訊類型,以及此資訊是否保留在物件檔或程式資料庫 (PDB) 檔案中。

語法

/Z7
/Zi
/ZI

備註

當您指定偵錯選項時,編譯程式會產生函式和變數、類型資訊和行位置的符號名稱,以供調試程式使用。 這個符號偵錯資訊可以包含在編譯程式所產生的物件檔(.obj檔案)中,或包含在可執行檔的個別 PDB 檔案中。.pdb 下列各節將說明偵錯資訊格式選項。

根據預設,如果未指定偵錯資訊格式選項,編譯程式不會產生偵錯資訊,因此編譯速度會更快。

/Z7

選項 /Z7 會產生物件檔,其中包含與調試程式搭配使用的完整符號偵錯資訊。 這些物件檔案和從它們建置的任何連結庫,可以大大大於沒有偵錯信息的檔案。 符號偵錯資訊包含變數、函式和行號的名稱和類型。 編譯程式不會產生 PDB 檔案。 不過,如果連結器已傳遞 /DEBUG 選項,仍然可以從這些對象檔或連結庫產生 PDB 檔案。

對於第三方連結庫偵錯版本的散發者來說,沒有 PDB 檔案是有好處的。 不過,在連結庫鏈接階段和偵錯期間,需要任何先行編譯標頭的物件檔。 如果對象檔中 .pch 只有類型資訊(且沒有程式代碼),您也必須在建置連結庫時,使用默認啟用的 /Yl [插入偵錯連結庫的 PCH 參考] 選項。

指定時/Z7,無法使用已取代/Gm的 [啟用最小重建] 選項。

/Zi

此選項 /Zi 會產生個別的 PDB 檔案,其中包含與調試程式搭配使用的所有符號偵錯資訊。 偵錯資訊不會包含在物件檔或可執行檔中,因此小得多。

的使用 /Zi 不會影響優化。 不過, 確實表示 /debug/Zi 如需詳細資訊,請參閱/DEBUG(產生偵錯資訊)。

當您同時 /Zi 指定 和 /clr時, DebuggableAttribute 屬性不會放在元件元數據中。 如果您想要的話,您必須在原始程式碼中指定它。 這個屬性可能影響應用程式的執行階段效能。 如需屬性如何影響 Debuggable 效能以及如何修改效能影響的詳細資訊,請參閱 讓影像更容易偵錯

編譯程式會將 PDB 檔案 <project>.pdb命名為 ,其中 <project> 是項目的名稱。 如果您在專案外部編譯檔案,編譯程式會建立名為 VC<x>.pdb的 PDB 檔案,其中 <x> 是使用中編譯程式版本的主要和次要版本號碼串連。 編譯程式會在使用此選項建立的每個物件檔案中內嵌 PDB 的名稱和識別時間戳簽章。 這個名稱和簽章會將調試程式指向符號和行號資訊的位置。 PDB 檔案中的名稱和簽章必須符合可執行檔,才能在調試程式中載入符號。 WinDBG 調試程式可以使用 命令載入不相符的 .symopt+0x40 符號。 Visual Studio 沒有載入不相符符號的類似選項。

如果您從使用 /Zi編譯的物件建立連結庫,當連結庫連結至程式時,必須提供相關聯的 PDB 檔案。 這表示,如果您發佈連結庫,您也必須散發 PDB 檔案。 若要建立包含偵錯資訊的連結庫,而不使用 PDB 檔案,您必須選取 /Z7 選項。 如果您使用先行編譯標頭選項,則先行編譯標頭和其餘原始程式碼的偵錯資訊會放在 PDB 檔案中。

/ZI

選項/ZI類似於 /Zi,但它會產生支援 [編輯後繼續] 功能格式的 PDB 檔案。 若要使用 [編輯後繼續偵錯] 功能,您必須使用此選項。 [編輯後繼續] 功能對於開發人員生產力很有用,但可能會導致程序代碼大小、效能和編譯程式一致性的問題。 因為大部分的優化與編輯和繼續不相容,因此使用 /ZI 會停用 #pragma optimize 程式代碼中的任何語句。 選項 /ZI 也與使用 __LINE__ 預先定義的巨集不相容;使用 編譯 /ZI 的程式代碼無法當做非類型樣板自變數使用 __LINE__ ,不過 __LINE__ 可用於巨集擴充。

選項/ZI/Gy強制在編譯中使用 [啟用函式層級連結]/FC [診斷中原始碼檔案的完整路徑] 選項。

/ZI/clr [Common Language Runtime 編譯] 不相容。

注意

此選項 /ZI 僅適用於以 x86 和 x64 處理器為目標的編譯程式。 此編譯程式選項不適用於以 ARM 處理器為目標的編譯程式。

在 Visual Studio 開發環境中設定這個編譯器選項

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

  2. 選取 [設定屬性]>C/C++>[一般] 屬性頁面。

  3. 修改 [ 偵錯資訊格式] 屬性。 選取 [確定] 儲存您的變更。

若要以程式方式設定這個編譯器選項

另請參閱

MSVC 編譯器選項
MSVC 編譯器命令列語法