错误: 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 位) 和 1.5 版 (16 位) 替换为较旧的 CK1020 错误消息。CK1020,该程序失败并不会调试程序。CK4009,与该程序没有故障,但丢弃所有的后续 nonprimitive 类型。这样,至少要为其类型不被丢弃这些符号调试程序。

解决方案

下面是为了减小应用程序中的符号的数量,以便成功地调试的几个事项:
  1. 编译只需要使用/zi 调试和 /Zd 用于其余的源代码文件。这将减少您的应用程序中的符号的数量。(如果您使用的程序员工作台 (PWB) 或可视工作台,它还需要您使用外部生成文件,因为编译不是模块,这些工具中有选择性)如果您选择使用 /Zd 编译,您将获得行号支持仅用于模块。使用链接器映射文件您可以确定您的公共符号的位置,以便可以至少全局数据以查看 CodeView 必要。有关更多的信息,请参阅下列文章 Microsoft 知识库中相应:
    48241映射文件地址和在内存中的位置之间的关系
  2. 如果要使用 Visual c + + 中使用 MFC,请尝试重建与/zi 开关的/z7 而不是 MFC 库。这将生成.PDB (程序数据库) 的文件将包含的所有符号的类型信息的整个库。编译源代码文件,时每次编译器将生成一个新的符号的类型信息它检查 PDB 文件,以查看此类型是否已经存在。如果是这样,类型不会添加。使用这一过程的类型信息的总数量减少了消除冗余本来会创建的 Microsoft 基础类 (MFC) 的.obj 文件中存在的类型使用/z7 的库。使用/zi 会导致程序代码执行,这有助于更有效地运行该程序之前减少冗余。
  3. Visual c + + 项目编译使用/fd 指定单个.PDB 文件为您的应用程序。再次,这里的想法是通过消除冗余中都有多个模块应用程序在程序执行之前减少的类型的数目。请注意这是自动的如果您正在构建从 Visual 平台。默认的文件将被命名为 MSVC.PDB: 使用/fd 允许您指定的备用名称。 由于默认情况下,使用 PDB 文件 (它消除了冗余信息),问题很少很多可能会发生。若要使用的 PDB 使用 / zi/不 z7 编译,和不关闭在 IDE 中的"程序数据库"时 (或使用 /PDB: 无命令行上)。
  4. 如有可能,应考虑消除一些更复杂的类型,如类、 结构、 枚举和联合。这将减少冗余包含在您的应用程序类型的可能性。
  5. 在所有编译的部分模块不包含任何调试信息。如果使用的 Microsoft 基础类必须小心不以调出与 _DEBUG 和 $ 不 _DEBUG 的情况下编译的模块编译的模块。尝试生成 MFC 库与 CODEVIEW = 0 或 CODEVIEW = 2 以减少的符号信息 (默认情况下为 DEBUG"= 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 规范要求符号调试信息都包含在由 (Visual c + + 中这些包括在对象模块和.PDB 文件),编译器发出的两个表。第一个表被称为 $ $ 符号,并描述了在对象文件 ; 符号,而第二个被称为 $ $ 类型,并包含有关符号类型的信息。例如对于该语句"int i ; 确定类型的符号"i"int"。使用这两个表中的记录中有字段到另一个表中的记录中的索引。此外,没有第三个表的链接器生成并写入到可执行文件的符号化信息。此表称为 PUBLICS,包含处理对象文件时遇到的每个公共符号在符号的记录。

CVPACK 的目的是删除重复的符号和类型信息和重写剩余的信息以优化 CodeView 处理的格式。此剩余的信息类型索引不能超过 64 的 K,因为索引本身是 16 位值。此索引是规范的一部分,因为它不能更改而不会破坏依赖于它,其中的许多由第三方供应商提供该工具。

属性

文章编号: 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
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 112335
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 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