注意: CK1020 或 CK4009 時發生型別資訊超過 64K

文章翻譯 文章翻譯
文章編號: 112335 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

徵狀

建置偵錯版本包含超過 64K 的型別索引資訊的應用程式可能會導致一或多個下列的錯誤訊息中根據 CVPACK 何種版本正在使用:
CVPACK: 嚴重錯誤 CK1020: 壓縮的類型索引超過 65535 單元 <filename.obj>
CVPACK: 警告 CK4009: 超過 64K 類型...捨棄後續的型別。
cvpack.exe 內部錯誤,例外狀況的程式碼 – 0xc0000005。

發生的原因

這些錯誤是到期部分至該 CodeView 符號的型別資訊索引是造成溢位,如果壓縮的符號類型數目超過 64K 的 16 位元值事實。

請注意 CK4009 Visual C++ 版本 1.0 (32 位元) 及較舊的 CK1020 錯誤訊息的版本 1.5 (16 位元) 取代。與 CK1020,packer 失敗,而且程式可能無法偵錯]。與 CK4009,packer 並不失敗,但會捨棄所有的後續 nonprimitive 型別。這至少可以讓要不捨棄類型的那些符號偵錯程式。

解決方案

以下是可以進行,以減少應用程式中的符號的數目,這樣它才能進行偵成功錯的幾件事:
  1. 只有您需要以/Zi 偵錯,並使用 /Zd 其餘的將來源檔案編譯。這會減少應用程式中的符號的數目。(如果您使用的程式設計人員工作 (PWB) 或 Visual 工作,它也您將需要使用一個外部的 Makefile 因為編譯不是選擇性這些工具內的模組)如果選擇使用 /Zd 編譯僅如模組就會出現行數字的支援。與連結器對應檔中,您可以判斷公用符號的位置供您至少檢視全域資料 CodeView 中如有需要。如需詳細資訊請參閱下列的發行項 「 Microsoft 知識庫 」 中:
    48241對應檔案位址和記憶體中的位置之間的關係
  2. 如果您使用 MFC 使用 Visual C++,請嘗試重新建置 MFC 程式庫與/Z7 而非/Zi 參數。這將會建置 (程式資料庫) 的.PDB 檔案以進行整個文件庫,將包含所有符號的型別資訊。編譯原始程式檔,時每次編譯器會產生新的符號的型別資訊它會檢查,看看是否已經存在這個型別在 PDB 檔案。如果是這樣,型別就不會加入。使用此程序,型別資訊的總量會降低藉由除去多餘的型別,否則就會出現在.OBJ 檔案建立為 Microsoft 基礎類別 (MFC) 使用/Z7 的程式庫。使用/Zi 引起會減少 packer 程式碼執行],可協助更有效地運作 packer 之前的任務。
  3. Visual C++ 專案的編譯使用/Fd 來指定單一的.PDB 檔案,為您的應用程式。再次,此處的概念是減少藉由消除都存在多重模組應用程式中,packer 執行之前的任務類型。請注意這是自動如果您正在建置從 Visual 工作。預設檔案將被命名為 MSVC.PDB: 使用/Fd 可讓您指定替代的名稱。 由於預設值是使用 PDB 檔 (這會排除多餘的資訊),問題是更不可能發生。若要以便使用 PDB 使用/Zi/不 Z7 編譯,並不要關閉 IDE 中的 [程式資料庫] 時 (或使用/PDB: NONE 命令列上)。
  4. 如果可能,請考慮消除某些更複雜的型別,例如類別、 結構、 列舉和等位。這會降低同時包含在您的應用程式類型的可能性。
  5. 在所有編譯但不含任何偵錯資訊模組的一些。如果使用 MFC,必須小心不以調出 _DEBUG 和 _DEBUG 沒有編譯的模組以編譯的模組。嘗試建置 MFC 程式庫與 CODEVIEW = 0 或 CODEVIEW = 2 減少的符號資訊 (預設值為偵錯 」 = 1",它定義了 _DEBUG)。當類別庫以 CODEVIEW 建置 = 0,您將不會有偵錯資訊可以使用任何程式庫。MFC 偵錯函式 TRACE 和 ASSERT 仍可使用,不過。 與 CODEVIEW = 2,程式庫的某些元件將會建置以偵錯資訊。在 README.TXT\MFC\SRC 說明進一步什麼每個選項進行方面的限制可用的 MFC 程式庫的偵錯資訊。額外的資訊也可以找到"類別程式庫使用者指南 > 附錄中,如下所示:
    附錄 B Visual C++ 版本 1.0 (16 位元)
    附錄 A 的 Visual C++ 版本 1.5 (16 位元)
    附錄 B Visual C++ 版本 1.1 (32 位元)
  6. 一個其他未確認可能的解決方案被與先行編譯標頭。您可能嘗試啟用或停用先行編譯標頭使用,無論哪個都是使用目前未被,然後重建所有項目。這可能有不同的標頭檔的應用程式使用而定的影響。

狀況說明

Microsoft 已確認此選項以在 MS-DOS 4.0、 4.1 及 4.26,版本的 CVPACK 公用程式和 CVPACK 公用程式的 Windows NT,版本 4.25 有問題。我們研究這個問題,並將張貼新資訊 「 Microsoft 知識庫 」 中可用時。

其他相關資訊

符號和型別 OMF 規格需要這些物件模組和.PDB 檔案中包含 Visual C++) 中編譯器所發出的兩個資料表中包含符號偵錯資訊。第一張表格稱為 $ $ 符號,描述物件檔 ; 中的符號,而第二個稱為 $ $ 不同,並包含符號類型的相關資訊。該陳述式,例如"int i ;"定義符號"i"的型別"int"。使用這兩個資料表的記錄中有欄位到另一個資料表記錄的索引。此外,是一種第三個的表格是由連結器產生的寫入可執行檔的符號資訊。此表格稱為 PUBLICS,而且會包含處理物件檔案時遇到的每個公用符號符號的記錄。

CVPACK 的目的是要移除重複的符號和型別資訊並重新寫入其餘的資訊以最佳化的 CodeView 處理的格式。因為索引本身是 16 位元值,這個剩餘的資訊類型的索引不能超過 64 K。因為此索引規格的一部分不能變更而不會破壞依存於它,其中有許多由協力廠商所提供之工具。

屬性

文章編號: 112335 - 上次校閱: 2003年10月23日 - 版次: 2.0
這篇文章中的資訊適用於:
  • Microsoft CVPACK for MS-DOS 4.0
  • Microsoft CVPACK for MS-DOS 4.10
  • Microsoft CVPACK for MS-DOS 4.26
  • Microsoft CVPACK Utility for Windows NT 4.25
  • Microsoft CVPACK Utility for Windows NT 4.27
關鍵字:?
kbmt KB112335 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:112335
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com