Pergunta

Se meus C ++ falhas de aplicativos no Windows Eu quero enviar informações de depuração útil para o nosso servidor.

No Linux eu usaria a função backtrace() GNU -? Existe um equivalente para Windows

Existe uma maneira de extrair informações de depuração útil após um programa deixou de funcionar? Ou apenas a partir de dentro do processo?

(Conselho ao longo das linhas de "teste que você aplicativo para que ele não falha" não é útil - todos os programas não-triviais terá bugs)

Foi útil?

Solução

A função StackWalk64 pode ser usado para tirar um rastreamento de pilha no Windows.

Se você pretende usar esta função, você deve ter certeza de compilar o código com FPO com deficiência -. Sem símbolos, StackWalk64 não será capaz de andar corretamente quadros FPO'd

Você pode obter algum código em execução em processo no momento do acidente através de um bloco __try/__except de nível superior chamando SetUnhandledExceptionFilter. Este é um pouco confiáveis, uma vez que exige que você tenha o código em execução dentro de um processo caiu. Alternativamente, você pode simplesmente o built-in Relatório de Erros do Windows para dados sobre o acidente a cobrar. Esta é mais confiável, uma vez que não exigem que você adicionar o código em execução dentro do comprometidas, processo caiu. O único custo é obter um certificado de assinatura de código, uma vez que você deve enviar um binário assinado para o serviço. https://sysdev.microsoft.com/en-US/Hardware/signup/ tem mais detalhes.

Outras dicas

Você pode usar a chamada API do Windows MiniDumpWriteDump se desejar rolar seu próprio código. Tanto o Windows XP e Vist automatizar esse processo e você pode se inscrever em https://winqual.microsoft.com para ter acesso aos relatórios de erros.

Também confira http://kb.mozillazine.org/Breakpad e http://www.codeproject.com/KB/debug/crash_report.aspx para outras soluções .

Este site oferece bastante uma visão detalhada de recuperação de pilha em Win32 depois de um C ++ exceção:

http://www.eptacom.net/pubblicazioni/pub_eng/except.html

Claro, isso só irá funcionar dentro do processo, por isso, se o processo fica encerrado ou deixa de funcionar até o ponto onde termina antes que o código é executado, ele não vai funcionar.

Gerar um arquivo de minidespejo. Você pode, em seguida, carregá-lo em windbg ou Visual Studio e inspecionar toda a pilha onde o acidente ocorreu.

Aqui está um bom lugar para começar a ler.

Sua bastante simples para despejar os endereços StackFrame atuais em um arquivo de log. Tudo que você tem a fazer é obter tal função chamada em falhas de programa (ou seja, uma interrupção de manipulador no Windows) ou afirma. Isso pode ser feito em versões lançadas também. O arquivo de log, em seguida, pode ser combinado com um arquivo de mapa resultando em uma pilha de chamadas com nomes de função.

publiquei um artigo sobre isso há alguns anos.

Consulte http://www.ddj.com/architect/185300443

Deixe-me descrever como eu lidar com falhas no meu aplicativo C ++ / WTL.

Em primeiro lugar, na função principal, eu chamo _set_se_translator , e passar em uma função que irá lançar uma exceção C ++ em vez de usar exceções janelas estruturados. Esta função recebe um código de erro, para o qual você pode obter uma mensagem de erro do Windows via FormatMessage , e um argumento PEXCEPTION_POINTERS, que você pode usar para escrever um minidump ( código aqui ). Você também pode verificar o código de excepção para certos erros "meltdown" que você deve apenas socorrer a partir, como EXCEPTION_NONCONTINUABLE_EXCEPTION ou EXCEPTION_STACK_OVERFLOW :) (Se é recuperável, I solicitar ao usuário para me enviar este arquivo minidump.)

O próprio arquivo de minidespejo pode ser aberto no Visual Studio como um projeto normal, e proporcionando-lhe criei um arquivo .PDB para o seu executável, você pode executar o projeto e ele vai saltar para o local exato do acidente, juntamente com a pilha de chamadas e registros, que podem ser examinadas sob o depurador.

Se você quiser pegar uma pilha de chamadas (mais outra informação bom) para um acidente de tempo de execução, em uma compilação mesmo no local de lançamento, então você precisa configurar Dr Watson (executar DRWTSN32.EXE). Se você verificar o 'gerar despejos de memória' opção, quando um aplicativo falhar, ele vai escrever um mini arquivo de despejo para o caminho especificado (chamado user.dmp).

Você pode tomar este, combiná-lo com os símbolos que você criou quando você construiu seu servidor (definir isso no seu compilador / vinculador para gerar arquivos pdb - mantê-los a salvo em casa, você usá-los para coincidir com o despejo para que possam trabalhar a fonte onde o acidente ocorreu)

Obter carga se windbg , abri-lo e usar a opção do menu para' despejo de memória'. Uma vez que é carregado tudo o que você pode digitar '~ # kp' para obter uma pilha de chamadas para cada thread (ou clique no botão na parte superior para o segmento atual).

Há bons artigos para saber como fazer isso em toda a web, Este é o meu favorito, e você vai querer ler este para ter uma compreensão de como helpyourself gerenciar os símbolos realmente facilmente.

Você terá que configurar uma estrutura de geração despejo em seu aplicativo, aqui é como você pode fazê-lo.

Você pode então fazer o upload do arquivo de despejo para o servidor para análise posterior usando analisadores de despejo como windbg.

Você pode querer usar o ADPlus para capturar o callstack acidente.

Você pode baixar e instalar ferramentas de depuração para Windows.

O uso de adplus é mencionado aqui: Adplus uso

Isso cria a memória completo ou cair despejo. Assim que tiver o despejo, Windbg vem para o resgate. Mapa dos pdbs e símbolos corretos e está tudo pronto para analisar o despejo. Para começar, use o comando "! Analyze -v"

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