Pergunta

Eu estou enfrentando um problema grave com o meu programa, que fica reproduzida apenas no local do cliente. Colocando troncos, não estão ajudando como eu duvido que a falha está acontecendo em um terço dll festa. Por algumas razões, eu não poderia começar a ajuda do provedor de biblioteca. Estou pensando em produzir uma descarga no ponto de falha, de modo que para analisá-lo offline. Essa é uma prática recomendada? Ou alguma alternativa?

Foi útil?

Solução

Sim, isso é algo que todos os programas devem ter e utilizar o mais rápido possível.

Eu sugiro que você não usar bibliotecas de terceiros. Crie suas próprias lixeiras vez. É muito simples e direto. Você basicamente precisa fazer o seguinte:

Seu programa precisa acessar dbghelp.dll . É um Windows DLL que permite que você crie chamada legível pilhas etc. O depurador usa essa DLL para exibir dados em seu processo. Ele também lida com pós depuração mortem, ou seja, dumps de algum tipo. Este dll pode seguramente ser distribuído com o seu software. Eu sugiro que você baixar e instalar Debugging Tools for Windows . Isto lhe dará acesso a todos os tipos de ferramentas e a melhor ferramenta WinDbg.exe e as últimas dbghelp.dll é também nessa distribuição.

Em DbgHelp.dll você chama por exemplo MiniDumpWriteDump () , que irá criar o arquivo de despejo e isso é mais ou menos isso. Você Terminou. Assim que você tem esse arquivo em suas mãos, você pode começar a usá-lo. Quer no Visual Studio Debugger, que provavelmente ainda pode ser associado com a extensão do arquivo .dmp, ou no WinDbg.

Agora, há algumas coisas para pensar enquanto você está nisso. Ao verificar arquivos de despejo como este, você precisa gerar .pdb quando você compilar e vincular o executável. Caso contrário, não há nenhuma chance de mapear os dados de despejo de dados legível, por exemplo, para obter bons callstacks e valores de variáveis ??etc. Isto também significa que você tem que salvar esses arquivos PDB. Você precisa ser capaz de igualar a eles exatamente contra essa mesma versão. Uma vez que os arquivos de despejo são a data carimbada com o carimbo de data do executável, o depurador precisa dos arquivos PDB exatas. Não importa se o seu código não mudou um único bit, se os arquivos PDB pertencem a outra sessão de compilação, você está frito.

Eu incentivo cada janelas win32 desenvolvedor de verificar o site do Oleg Starodumov DebugInfo.com . Ele contém uma grande quantidade de amostras e tutoriais e como você pode configurar e sintonizar o seu geração de arquivo de despejo. Há, naturalmente, uma infinidade de maneiras para excluir determinados dados, criar a sua mensagem de depuração personalizada para anexar ao despejo etc.

Tenha em mente que minidumps irá conter informações muito limitadas sobre o estado da aplicação em tempo de exceção. O trade off é um arquivo pequeno (cerca de 50-100 kB dependendo de suas configurações). Mas se você quiser, você pode criar um completo despejo, que conterá o estado de toda a aplicação, ou seja, globals e até mesmo objetos de kernel. Esses arquivos podem ser enorme e só deve ser usado em casos extremos.

Se há aspectos legais, apenas se certificar de que seus clientes estão cientes do que você está fazendo. Aposto que você já tem algum contrato em que você não é suposto a revelar segredos comerciais ou outros aspectos legais. Se os clientes se queixam, convencê-los o quanto é importante para encontrar erros e que isso irá melhorar a qualidade do software drasticamente. Mais ou menos qualidade superior ao custo de nada. Se não lhes custa nada, que também é um bom argumento:)

Finalmente, aqui está um outro grande site, se você quiser ler mais sobre análise de despejo de memória: dumpanalysis.org

Espero que isso ajude. Por favor, comente se você quer que eu explique mais.

Felicidades!

Editar:

Só queria acrescentar que MiniDumpWriteDump () requer que você tenha um ponteiro para uma MiniDump-EXCEÇÃO-informação (com sublinhados) struct. Mas o GetExceptionInformation () macro fornece isso para você no momento da exceção no seu manipulador de exceção (manipulação de exceção estruturada ou SEH):

__try {

}
__except (YourHandlerFunction(GetExceptionInformation())) {

}

YourHandlerFunction () será tele um cuidando de gerar a minidump (ou alguma outra função para baixo da cadeia de chamada). Além disso, se você tem erros personalizados no seu programa, por exemplo, acontece algo que não deveria acontecer, mas tecnicamente não é uma exceção, você pode usar RaiseException () para criar o seu próprio.

GetExceptionInformation () só podem ser usados ??neste contexto e em nenhum outro lugar durante a execução do programa.

Outras dicas

despejos de memória são um método muito comum solução de problemas e pode ser muito eficaz, especialmente para problemas que só se reproduzem no site do cliente.

Apenas certifique-se que o cliente / cliente entende o que você está fazendo e que você tem permissão. É possível que um despejo de memória pode ter informações confidenciais que um cliente pode não querer (ou ser permitido) para deixar sair pela porta ou sobre o fio.

Melhor do que há bibliotecas que irá fazer o upload de dados de colisão suportá-lo.

BugDump e BugSplat

E não é a maneira da Microsoft:

http://msdn.microsoft.com/en-us/library /aa936273.aspx

Disclaimer:. Eu não sou um advogado, nem eu fingir ser um, este não é um aconselhamento jurídico

Os dados que você pode incluir em toras e despejos de memória também dependem do que domínio que você está trabalhando. Por exemplo, sistemas de equipamentos médicos e de informação do paciente, muitas vezes contêm dados sensíveis sobre os pacientes que não deveriam estar visíveis para pessoas não autorizadas.

regula a HIPAA regra de privacidade o uso e divulgação de certos informações mantidas por "entidades abrangidas" (...) Estabelece normas para o uso e divulgação de Protegido Informação em Saúde (PHI). PHI é qualquer informação detida por uma entidade coberta que diz respeito estado de saúde, prestação de cuidados de saúde ou pagamento para os cuidados de saúde que pode ser ligado a um indivíduo. [10] Isto é interpretado em vez amplamente e inclui qualquer parte de registro médico de um indivíduo ou Histórico de pagamento. - Wikipedia

Não deve ser possível de informações de saúde apontam para um indivíduo. O despejos de memória e os registros devem ser anónimos e despojado de qualquer informação sensível, ou não enviado a todos.

Talvez isto não se aplica ao seu caso específico, de modo que este é mais de uma nota geral. Eu acho que se aplica a outros domínios que lidam com informações sensíveis, tais como militar e financeira, e assim por diante.

Basicamente, a maneira mais fácil de produzir um arquivo de despejo é usando adplus. Você não precisa alterar seu código.

Adplus faz parte das ferramentas de depuração para Windows, como mencionado no artigo acima. Adplus é basicamente um automação VBScript enorme de windbg.

O que você tem que fazer para uso adplus:

  1. Faça o download e instalar as ferramentas de depuração para Windows para C: \ depuradores
  2. iniciar o aplicativo
  3. abrir uma linha de comando e navegue até c: \ depuradores
  4. executar esta linha "adplus -crash your_exe.exe"
  5. reproduzir a falha

você vai ter um minidespejo com todas as informações que você precisa. você pode abrir o despejo de memória em seu depurador favorito. dentro windbg, o comando "analisar -v" me ajudou em pelo menos 40% de todas as falhas que só aconteceram no local do cliente e não eram reprodutíveis em casa.

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