Erro: CK1020 ou CK4009 foram encontrados ao tipo de informações excede 64 K

Traduções de Artigos Traduções de Artigos
Artigo: 112335 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sintomas

Criar uma versão de depuração de uma aplicação que contém mais do que 64 K de tipo de informações do índice pode causar um ou mais das seguintes mensagens de erro, dependendo de qual a versão do CVPACK está a ser utilizada:
Erro fatal CVPACK: CK1020: índice de tipo compactada excede 65535 no módulo <filename.obj>
CVPACK: aviso CK4009: excedido tipos de 64 K... rejeitar tipos subsequentes.
cvpack.exe Erro interno, código de excepção 0xc0000005.

Causa

Estes erros vencem em parte para o facto de tipo simbólica informações de índice esse CodeView é um valor de 16 bits, que faz com que um erro de excesso se o número de tipos de símbolo compactada exceder 64 K.

Note que CK4009 é um Visual C++ versão 1.0 (32 bits) e a versão 1.5 (16 bits) substitui a mensagem de erro CK1020 mais antiga. Com CK1020, o packer falhou e o programa não pode ser depurado. Com CK4009, o packer não falha, mas rejeita todos os tipos nonprimitive subsequentes. Isto menos permitirá o programa ser depurado para aqueles símbolos cujos tipos de não tem sido rejeitados.

Resolução

Eis algumas coisas que podem ser desenvolvidas para reduzir o número de símbolos numa aplicação de modo a ser depurado com êxito:
  1. Compile apenas os ficheiros de origem que necessitam para depuração com /Zi e utilizar /Zd para o resto. Isto reduz o número de símbolos da aplicação. (Se estiver a utilizar Programmer WorkBench (PWB) ou Workbench Visual, irá também requerem a utilização um makefile externo, porque compilação não é módulo selectivo dentro destas ferramentas.) Se optar por compilar com /Zd, obterá linha número suporte apenas para os módulos. Com um mapfile linker pode determinar a localização dos símbolos de públicas para que poder visualizar, pelo menos, os dados globais em CodeView se necessário. Para obter informações adicionais, consulte o seguinte artigo na base de dados de conhecimento da Microsoft:
    48241Relação entre endereços de ficheiro de mapa e localização na memória
  2. Se estiver a utilizar o MFC com o Visual C++, tente recriar as bibliotecas MFC com o parâmetro /Zi em vez de /Z7. Isto irá criar um ficheiro .PDB (programa de base de dados) para toda a biblioteca que irá conter todas as informações de tipo simbólica. Ao compilar os ficheiros de origem, sempre que o compilador gera informações de tipo para um novo símbolo, verifica o ficheiro PDB para verificar se este tipo já está presente. Se for esse o caso, o tipo não é adicionado. Utilizar este processo, a quantidade total de tipo de informações é reduzida eliminando tipos redundantes que caso contrário, deverá existir nos ficheiros .OBJ criados para o Microsoft Foundation Classes (MFC) bibliotecas utilizando /Z7. Utilizar /Zi faz com que redundancies seja reduzido antes do packer código é executado, que ajuda a packer funcionar mais eficientemente.
  3. Para projectos do Visual C++, compile utilizar /fd para especificar um único ficheiro .PDB para a aplicação. Novamente, aqui a ideia é reduzir o número de tipos de eliminando redundancies estão presentes no multi módulo aplicações antes do packer executa. Note que isto é automático se estiver a criar de Workbench Visual. O ficheiro predefinido terá o nome MSVC.PDB: utilização /fd permite-lhe especificar um nome alternativo. Uma vez que a predefinição é utilizar ficheiros PDB (que elimina informações redundantes), é muito menos probabilidades de ocorrer o problema. Para activar a utilização do PDB, utilize /Zi não /Z7 quando compilar e não desactivar "Programa Database" no IDE do (ou utilize /PDB: NONE na linha de comandos).
  4. Se possível, considere eliminar alguns dos tipos mais complexos como classes, estruturas, enum e as uniões. Isto reduzirá a probabilidade dos tipos de redundantly sejam incluídos na sua aplicação.
  5. Compile alguns dos módulos sem quaisquer informações de depuração de todo. Se utilizar o Microsoft Foundation Classes, deve ter o cuidado para não misturar os módulos compilados com _DEBUG e os módulos compilados sem _DEBUG. Tente criar biblioteca de MFC com CODEVIEW = 0 ou CODEVIEW = 2 para reduzir a quantidade de informações simbólicas (a predefinição para depuração é "= 1", que define _DEBUG). Quando a biblioteca de classes baseia-se com CODEVIEW = 0, não terá qualquer biblioteca disponíveis informações de depuração. MFC depuração funções TRACE e ASSERT ainda estará disponível, no entanto. Com CODEVIEW = 2, alguns componentes da biblioteca vão ser criados com as informações de depuração. O Leia-me.txt em\MFC\SRC explica mais que cada um da fazer opções em termos de limitar as informações de depuração disponíveis para a biblioteca MFC. Obter informações adicionais também podem ser encontradas maneira num apêndice do "Do utilizador de bibliotecas de classe Guide":
    Apêndice B para o Visual C++ versão 1.0 (16 bits)
    Apêndice A para o Visual C++ versão 1.5 (16 bits)
    Apêndice B para o Visual C++ versão 1.1 (32 bits)
  6. Uma outra não confirmada possível solução está relacionado com cabeçalhos pré-compilados. Pode tentar activar ou desactivar a utilização de cabeçalhos de pré-compilados, que é não está actualmente a ser utilizado e reconstrução, em seguida, tudo. Isto pode ter efeitos diferentes consoante utilizar a aplicação ficheiros de cabeçalho.

Ponto Da Situação

Microsoft confirmou que este problema existe no utilitário CVPACK para MS-DOS, versões 4.0, 4.1 e 4.26 e CVPACK utilitário para Windows NT, versão 4.25. Está a investigar este problema e publicará novas informações na base de dados de conhecimento da Microsoft como fica disponível.

Mais Informação

O símbolo e o tipo OMF especificação requer que informações de depuração simbólicas estar contidos em duas tabelas emitidas pelo compilador (no Visual C++ estes estão incluídos nos módulos de objecto e o ficheiro .PDB). Da primeira tabela chama $ $ SÍMBOLOS e descreve os símbolos no ficheiro de objecto; enquanto o segundo é designado por tipos de $ $ e contém informações sobre os tipos de símbolo. Por exemplo, a afirmação "int i; int"Define o símbolo "i" do tipo"" ". Existem campos dos registos de ambas as tabelas que são utilizadas para o índice para os registos de outra tabela. Para além disso, existe uma terceira tabela de simbólica informação que é gerada pelo linker e escrita no ficheiro executável. Esta tabela é designado por entidades e contém os registos símbolo para cada símbolo público encontrado ao processar os ficheiros de objecto.

Objectivo do CVPACK consiste em Remover informações duplicadas símbolo e o tipo e reescrever as restantes informações num formato optimizado para processamento CodeView. Os índices de tipo para estas informações restantes não pode exceder 64 K, porque o índice propriamente dito é um valor de 16 bits. Uma vez que este índice faz parte da especificação, não pode ser alterado sem interromper as ferramentas que dependem, muitas das quais são fornecidas por outros fabricantes.

Propriedades

Artigo: 112335 - Última revisão: 23 de outubro de 2003 - Revisão: 2.0
A informação contida neste artigo aplica-se 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
Palavras-chave: 
kbmt KB112335 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 112335
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

Submeter comentários

 

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