Error: CK1020 o CK4009 detectado al información de tipo excede 64 KB

Seleccione idioma Seleccione idioma
Id. de artículo: 112335 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Síntomas

Crear una versión depuración de una aplicación que contiene más de 64 KB de información de índice de tipo puede producir uno o varios de los mensajes de error siguientes, dependiendo de qué versión de CVPACK se se utiliza:
Error grave de CVPACK: CK1020: índice de tipo empaquetado supera 65535 en módulo <filename.obj>
CVPACK: advertencia CK4009: excedido tipos de 64 KB... descartar tipos posteriores.
CVPACK.exe ERROR interno, código de excepción - 0xc0000005.

Causa

Estos errores son debidos en parte a que el hecho de tipo simbólico información índice del que CodeView es un valor de 16 bits, lo que provoca un desbordamiento si el número de tipos empaquetados símbolo excede 64 KB.

Observe que CK4009 es un Visual C++ versión 1.0 (32 bits) y la versión 1.5 (16 bits) sustituye la mensaje de error CK1020 anteriores. Con CK1020, packer el error y no se pudo ser depurando el programa. Con CK4009, el packer no falla, pero descarta todos los tipos no primitivos posteriores. Esto permitirá al menos el programa se depure para esos símbolos cuyos tipos no se han descartado.

Solución

Éstas son algunas cosas que pueden hacerse para reducir el número de símbolos en una aplicación de manera que puede depurarse correctamente:
  1. Compilar sólo los archivos de origen que desea depurar con /Zi y utilizar /Zd para el resto. Esto reducirá el número de símbolos en la aplicación. (Si está utilizando Programmer WorkBench (PWB) o de Visual Workbench, también requerirá que utilice un archivo MAKE externo, porque compilación no es módulo selectiva dentro de estas herramientas.) Si elige compile con/Zd, obtendrá compatibilidad con número de línea sólo para los módulos. Con un archivo de asignaciones del vinculador puede determinar la ubicación de los símbolos públicos para que al menos que pueda ver los datos globales en CodeView si es necesario. Para obtener información adicional, consulte los siguientes artículos de Microsoft Knowledge Base:
    48241Relación entre direcciones de archivo de asignación y ubicación en la memoria
  2. Si está utilizando MFC con Visual C++, intente volver a generar las bibliotecas MFC con el modificador/Zi en lugar de/Z7. Esto generará un archivo PDB (base de datos de programa) para la biblioteca completa que contendrá toda la información de tipo simbólico. Al compilar los archivos de origen, cada vez el compilador genera información tipo para un nuevo símbolo, comprueba el archivo PDB si este tipo ya está presente. Si es así, no se agrega el tipo. Mediante este proceso, se reduce la cantidad total de información de tipo eliminando tipos redundantes que estarían presentes en los archivos .obj creados para MFC (Microsoft Foundation Class) bibliotecas mediante/Z7. El uso de /Zi produce redundancias reducirse antes de que el código packer se ejecute, que ayuda a la packer funcionar más eficazmente.
  3. Para proyectos de Visual C++, compilar utilizando /Fd para especificar un único archivo .pdb para la aplicación. De nuevo, la idea es reducir el número de tipos eliminando redundancias que están presentes en varias aplicaciones de módulo antes de que el packer se ejecute. Tenga en cuenta que esto es automático si se está generando desde la ficha trabajo Visual. El archivo predeterminado se llamará MSVC.PDB: utilizando /FD le permite especificar un nombre alternativo. Debido a que el valor predeterminado es utilizar archivos PDB (que elimina la información redundante), el problema es mucho menos probable que ocurra. Para habilitar el uso de la PDB, utilice /Zi no/Z7 cuando compila y no desactivar "Programa Database" en el IDE (o utilice/PDB: NONE en la línea de comandos).
  4. Si es posible, considere la eliminación de algunos de los tipos más complejos tales como clases, estructuras, enumeraciones y uniones. Esto reducirá la probabilidad de los tipos de forma redundante se incluyan en la aplicación.
  5. Compile algunos de los módulos sin información de depuración en absoluto. Si utiliza Microsoft Foundation Classes, debe tenerse cuidado para no de mezclar los módulos compilados con _DEBUG y módulos compilados sin _DEBUG. Intente crear la biblioteca MFC con CODEVIEW = 0 o CODEVIEW = 2 para reducir la cantidad de información simbólica (el valor predeterminado de DEBUG es "= 1", que define _DEBUG). Cuando se genera la biblioteca de clase con CODEVIEW = 0, no tendrá ninguna biblioteca disponible información de depuración. La depuración funciones TRACE y ASSERT de MFC seguirá estando disponible, sin embargo. Con CODEVIEW = 2, algunos componentes de la biblioteca se integrará con información de depuración. Readme.txt en\MFC\SRC explica con más detalle qué cada uno de los pendientes de opciones en términos de limitar la información de depuración disponible para la biblioteca MFC. También se puede encontrar información adicional en el apéndice de la "Guía del usuario de bibliotecas de clase" como sigue:
    Apéndice B para Visual C++ versión 1.0 (16 bits)
    Apéndice A para Visual C++ versión 1.5 (16 bits)
    Apéndice B para Visual C++ versión 1.1 (32 bits)
  6. Una otra solución posible sin confirmar está relacionado con los encabezados precompilados. Puede intentar habilitar o deshabilitar el uso de encabezados precompilados, sea actualmente no se utiliza y, a continuación, volver a generar todo. Esto puede tener efectos diferentes según de uso la aplicación de archivos de encabezado.

Estado

Microsoft ha confirmado que trata de un problema de utilidad CVPACK para MS-DOS, las versiones 4.0, 4.1 y 4.26 y CVPACK utilidades para Windows NT, versión 4.25. Se está investigando este problema y se publicará nueva información aquí, en Microsoft Knowledge Base, cuando esté disponible.

Más información

El símbolo y la especificación de tipo OMF requiere que la información simbólica de depuración estar contenidos en dos tablas emitidas por el compilador (en Visual C++ se incluyen en los módulos de objeto y el archivo .pdb). La primera tabla se denomina $ $ SYMBOLS y describe los símbolos en el archivo objeto; mientras que el segundo se denomina $ $ tipos y contiene información sobre los tipos de símbolos. Por ejemplo, la instrucción "int i;"define el símbolo "i" de tipo"int". No hay campos en los registros de ambas tablas se utilizan para indizar en los registros de la otra tabla. Además, hay una tercera tabla de información simbólica que es generado por el vinculador y escribir en el archivo ejecutable. Esta tabla se denomina PUBLICS y contiene los registros de símbolo para cada símbolo pública que encontró al procesar los archivos objeto.

Propósito del CVPACK es quitar información duplicada de símbolo y el tipo y vuelva a escribir la información restante en un formato optimizado para el procesamiento de CodeView. Los índices de tipo de esta información restante no deben exceder 64 K, porque el índice sí es un valor de 16 bits. Debido a que este índice forma parte de la especificación, no se puede cambiar sin interrumpir las herramientas que dependen de él, muchos de los cuales son suministrados por otros fabricantes.

Propiedades

Id. de artículo: 112335 - Última revisión: jueves, 23 de octubre de 2003 - Versión: 2.0
La información de este artículo se refiere a:
  • 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
Palabras clave: 
kbmt KB112335 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 112335
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

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