Erro: CK1020 ou CK4009 encontrado quando informações de tipo ultrapassam 64 K

Traduções deste artigo Traduções deste artigo
ID do artigo: 112335 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sintomas

Criando uma versão de um aplicativo que contém mais de 64 K de informações de índice de tipo de depuração pode causar uma ou mais das seguintes mensagens de erro, dependendo de qual versão do CVPACK é que está sendo usado:
Erro fatal CVPACK: CK1020: índice de tipo compactada excede 65535 em módulo <filename.obj>
CVPACK: aviso CK4009: excedido tipos de 64 K... descartar tipos subseqüentes.
cvpack.exe Erro interno, código de exceção - 0xc0000005.

Causa

Esses erros são vencimento em parte ao fato de que índice de informações de tipo simbólico do CodeView que é um valor de 16 bits, que faz com que um estouro se o número de tipos de símbolo compactada exceder 64 K.

Observe que CK4009 é um Visual C++ versão 1.0 (32-bit) e versão 1.5 (16 bits) substituição para a mensagem de erro CK1020 mais antiga. Com CK1020, o packer falha e o programa não pode ser depurado. Com CK4009, o packer não falha, mas descarta todos os tipos de nonprimitive subseqüentes. Pelo menos isso permitirá que o programa a ser depurado para esses símbolos cujos tipos não foram descartados.

Resolução

Aqui estão algumas coisas que podem ser feitas para reduzir o número de símbolos em um aplicativo para que ele possa ser depurado com êxito:
  1. Compile apenas os arquivos de origem que você precisa depurar com /Zi e usar /Zd para o resto. Isso reduzirá o número de símbolos em seu aplicativo. (Se você estiver usando Programmer Bancada de trabalho (PWB) ou o Workbench Visual, ela também exigirá que você use um makefile externo, porque compilação não é um módulo seletivo dentro dessas ferramentas.) Se você optar por compilar com/Zd, você obterá linha número suporte somente para os módulos. Com um vinculador mapfile você pode determinar o local do seus símbolos públicos para que você menos possa exibir seus dados globais no CodeView se necessário. Para obter informações adicionais, consulte os seguintes artigos na Base de dados de Conhecimento Microsoft:
    48241Relação entre endereços de arquivo de mapa e local na memória
  2. Se você estiver usando o MFC com o Visual C++, tente recriar as bibliotecas MFC com a opção /Zi em vez de/Z7. Isso criará um arquivo .PDB (banco de dados do programa) para a biblioteca inteira que irá conter todas as informações de tipo simbólico. Ao compilar os arquivos de origem, ele sempre que o compilador gera informações de tipo para um novo símbolo, verifica o arquivo PDB para ver se esse tipo já está presente. Em caso afirmativo, o tipo não é adicionado. Usando esse processo, a quantidade total de informações de tipo é reduzida eliminando redundantes tipos seriam presentes nos arquivos .obj criados para o Microsoft Foundation Class (MFC) bibliotecas usando/Z7. O uso de /Zi causa redundâncias seja reduzido antes de executa o código packer, que ajuda a packer operar com mais eficiência.
  3. Para projetos Visual C++, compile usando /FD para especificar um único arquivo .PDB para seu aplicativo. Novamente, a idéia aqui é reduzir o número de tipos ao eliminar redundâncias que estão presentes em várias módulo aplicativos antes de executa o packer. Observe que isso é automático se você estiver criando do Workbench Visual. O arquivo padrão será nomeado MSVC.PDB: usar /FD lhe permite especificar um nome alternativo. Como o padrão é usar os arquivos PDB (o que elimina informações redundantes), o problema é muito menos provável de ocorrer. Para habilitar o uso de PDB, use /Zi não/Z7 quando compilar e não desativar "Programa Database" no IDE (ou use /PDB: NONE na linha de comando).
  4. Se possível, considere a eliminação alguns dos tipos mais complexos, como classes, estruturas, enumerações e uniões. Isso reduzirá a probabilidade dos tipos de redundância sejam incluídos em seu aplicativo.
  5. Compile alguns dos módulos sem nenhuma informação de depuração em todos os. Se usando o Microsoft Foundation Classes, deve ter cuidado para não misturar módulos compilados com _DEBUG e módulos compilados sem _DEBUG. Tente criar a biblioteca MFC com CODEVIEW = 0 ou CODEVIEW = 2 para reduzir a quantidade de informações simbólicas (o padrão para DEBUG é "= 1", que define _DEBUG). Quando a biblioteca de classes é criada com CODEVIEW = 0, você não terá qualquer biblioteca de depuração informações disponíveis. O MFC depuração TRACE e declaração de funções ainda estará disponível, no entanto. Com CODEVIEW = 2, alguns componentes da biblioteca serão compilados com informações de depuração. O Leiame.txt no\MFC\SRC explica mais que cada um do fazer opções em termos de limitar as informações de depuração disponíveis para a biblioteca MFC. Informações adicionais também podem ser encontradas no apêndice do "Guia do usuário de bibliotecas de classe" da seguinte maneira:
    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 Visual C++ versão 1.1 (32 bits)
  6. Uma outra solução possível não confirmada está relacionada a cabeçalhos pré-compilados. Você pode tentar ativar ou desativar o uso de cabeçalhos pré-compilados, que for não sendo usado e, em seguida, recompilação tudo. Isso pode ter efeitos variáveis, dependendo do uso do aplicativo de arquivos de cabeçalho.

Situação

A Microsoft confirmou este é um problema 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. Estamos estiver pesquisando esse problema e divulgaremos novas informações na Base de dados de Conhecimento da Microsoft como ele se torna disponível.

Mais Informações

O símbolo e a especificação do tipo OMF requer que informações de depuração simbólicas estar contidas em duas tabelas emitidas pelo compilador (no Visual C++ esses estão incluídos nos módulos de objeto e o arquivo .pdb). A primeira tabela é chamada de SÍMBOLOS de $ $ e descreve os símbolos no arquivo do objeto; enquanto a segunda é chamada $ $ tipos e contém informações sobre os tipos de símbolo. Por exemplo, a instrução "int i;"define o símbolo "i" do tipo"int". Há campos nos registros de ambas as tabelas que são usados para o índice para os registros de outra tabela. Além disso, há uma terceira tabela de informações simbólicas que são geradas pelo vinculador e gravadas no arquivo executável. Esta tabela é chamada PUBLICS e contém os registros símbolo de cada símbolo público encontrado ao processar os arquivos de objeto.

Finalidade do CVPACK é remover informações duplicadas de símbolo e o tipo e regrava as informações restantes em um formato otimizado para processamento CodeView. Os índices de tipo para obter essas informações restantes não devem exceder 64 K, porque o índice propriamente dito é um valor de 16 bits. Como esse índice é parte da especificação, ele não pode ser alterado sem quebrar as ferramentas que dependem dele, muitos dos quais são fornecidos por fornecedores de terceiros.

Propriedades

ID do artigo: 112335 - Última revisão: quinta-feira, 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 112335
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.

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