Pergunta

Eu tenho algum código em MS VC ++ 6.0 que estou depuração. Por alguma razão, neste determinado ponto onde eu estou tentando excluir alguma memória alocada dinamicamente, ele quebra e eu recebo uma caixa de mensagem aparecer dizendo "Usuário Breakpoint chamado de código de blah blah" .. então a janela de desmontagem aparece e I veja

*memory address* int      3

O estranho é, não há lugar no código que eu estou chamando uma instrução de montagem como este (eu acho asm int 3 é um comando quebra de hardware para x86?) ..

o que poderia estar causando isso?

EDIT: RESPOSTA: Meu código era "andar fora da final" de uma matriz, mas apenas em locais marcados pelo Visual depuração Estúdio com 0xFDFDFDFD, que é chamado de uma cerca NoMan'sLand .. Eu acho que é também chamado de um Off -de-um erro .. Esta matriz não estava relacionado ao ponto onde eu estava liberar a memória quando o erro foi ocorrendo. O que tornava mais difícil de detectar ..: (

Foi útil?

Solução

Você provavelmente bater código nas rotinas pilha de depuração que têm encontrado corrupção de pilha.

O que faz o olhar pilha de chamadas como quando você bateu o Int 3?

Edit: Com base no rastreamento de pilha em seus comentários, o _CrtIsValidHeapPointer() rotina está dizendo que o ponteiro de ser libertado é ruim. Aqui está o trecho de código de fonte DBGHEAP.C do MSVC:

    /*
     * If this ASSERT fails, a bad pointer has been passed in. It may be
     * totally bogus, or it may have been allocated from another heap.
     * The pointer MUST come from the 'local' heap.
     */
    _ASSERTE(_CrtIsValidHeapPointer(pUserData));

pUserData seria o valor do ponteiro que você está deleteing.

Outras dicas

(acho asm int 3 é uma quebra de hardware de comando para x86?

É. É chamado "ponto de interrupção hardware" . Se você estiver usando o depurador VS com o código fonte do projeto, é apenas como um ponto de interrupção (mas no código). Desde vs2005, se seu aplicativo é lançado sem qualquer depurador, o aplicativo simplesmente falhar, como se ele lançou uma exceção não gerenciado.

No monte de empresa, há uma macro simples usado para acrescentar que ponto de interrupção no código. Que pode substituir afirma e exceções em alguns casos (duros e raros):

#define BREAKPOINT __asm { int 3; }

BREAKPOINT;

Veja:

Por isso, sugiro à procura de algum objeto Macro ou fazendo isso, ou talvez Appen em um módulo (dll / lib) que você não tem o código de?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top