Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Nem todos os bugs podem ser encontrados antes do lançamento, o que significa que nem todos os bugs que lançam exceções podem ser encontrados antes do lançamento. Felizmente, a Microsoft incluiu no Platform SDK uma função para ajudar os desenvolvedores a coletar informações sobre exceções descobertas pelos usuários. A funçãoMiniDumpWriteDump dograva as informações necessárias de despejo de memória em um arquivo sem salvar todo o espaço do processo. Esse arquivo de informações de despejo de memória é chamado de minidump. Este artigo técnico fornece informações sobre como escrever e usar um minidump.
- Escrevendo um Minidump
- de segurança de roscas
- Escrevendo um Minidump com Code
- Usando Dumpchk.exe
- Analisando um Minidump
- Resumo
Escrevendo um Minidump
As opções básicas para escrever um minidump são as seguintes:
Não faça nada. O Windows gera automaticamente um minidump sempre que um programa lança uma exceção não tratada. A geração automática de um minidump está disponível desde o Windows XP. Se o usuário permitir, o minidump será enviado para a Microsoft, e não para o desenvolvedor, através do Relatório de Erros do Windows (WER). Os desenvolvedores podem obter acesso a esses minidumps por meio do Windows Desktop Application Program.
A utilização do WER requer:
- Desenvolvedores para assinar seus aplicativos usando Authenticode
- Os aplicativos têm recurso VERSIONINFO válido em cada executável e DLL
Se você implementar uma rotina personalizada para exceções não tratadas, será altamente recomendável usar a função ReportFault no manipulador de exceções para também enviar um minidump automatizado para o WER. A função ReportFault lida com todos os problemas de conexão e envio do minidump para o WER. Não enviar minidumps para o WER viola os requisitos do Games for Windows.
Para obter mais informações sobre WER, consulte Relatório de Erros do Windows.
Use um produto do Microsoft Visual Studio Team System. No menu Depurar, clique em Salvar despejo como para salvar uma cópia de um despejo. O uso de um dump salvo localmente é apenas uma opção para testes e depuração internos.
Adicione código ao seu projeto. Adicione o função MiniDumpWriteDump e o código de tratamento de exceção apropriado para salvar e enviar um minidump diretamente para o desenvolvedor. Este artigo demonstra como implementar essa opção. No entanto, observe que MiniDumpWriteDump não funciona atualmente com código gerenciado e só está disponível no Windows XP, Windows Vista, Windows 7.
Segurança de roscas
MiniDumpWriteDump faz parte da biblioteca DBGHELP. Essa biblioteca não é thread-safe, portanto, qualquer programa que use MiniDumpWriteDump deve sincronizar todos os threads antes de tentar chamar MiniDumpWriteDump.
Escrevendo um Minidump com Código
A implementação real é simples. A seguir está um exemplo simples de como usar MiniDumpWriteDump.
#include <dbghelp.h>
#include <shellapi.h>
#include <shlobj.h>
int GenerateDump(EXCEPTION_POINTERS* pExceptionPointers)
{
BOOL bMiniDumpSuccessful;
WCHAR szPath[MAX_PATH];
WCHAR szFileName[MAX_PATH];
WCHAR* szAppName = L"AppName";
WCHAR* szVersion = L"v1.0";
DWORD dwBufferSize = MAX_PATH;
HANDLE hDumpFile;
SYSTEMTIME stLocalTime;
MINIDUMP_EXCEPTION_INFORMATION ExpParam;
GetLocalTime( &stLocalTime );
GetTempPath( dwBufferSize, szPath );
StringCchPrintf( szFileName, MAX_PATH, L"%s%s", szPath, szAppName );
CreateDirectory( szFileName, NULL );
StringCchPrintf( szFileName, MAX_PATH, L"%s%s\\%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp",
szPath, szAppName, szVersion,
stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond,
GetCurrentProcessId(), GetCurrentThreadId());
hDumpFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
ExpParam.ThreadId = GetCurrentThreadId();
ExpParam.ExceptionPointers = pExceptionPointers;
ExpParam.ClientPointers = TRUE;
bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL);
return EXCEPTION_EXECUTE_HANDLER;
}
void SomeFunction()
{
__try
{
int *pBadPtr = NULL;
*pBadPtr = 0;
}
__except(GenerateDump(GetExceptionInformation()))
{
}
}
Este exemplo demonstra o uso básico de MiniDumpWriteDump e as informações mínimas necessárias para chamá-lo. O nome do arquivo de despejo cabe ao desenvolvedor; no entanto, para evitar colisões de nome de arquivo, é aconselhável gerar o nome do arquivo a partir do nome e número de versão do aplicativo, os IDs de processo e thread e a data e hora. Isso também ajudará a manter os minidumps agrupados por aplicativo e versão. Cabe ao desenvolvedor decidir quanta informação é usada para diferenciar nomes de arquivos minidump.
Deve-se notar que o nome do caminho no exemplo anterior foi gerado chamando o função GetTempPath para recuperar o caminho do diretório designado para arquivos temporários. O uso desse diretório funciona mesmo com contas de usuário menos privilegiadas e também impede que o minidump ocupe espaço no disco rígido depois que não for mais necessário.
Se você arquivar o produto durante o processo diário de compilação, certifique-se também de incluir símbolos para a compilação para que você possa depurar uma versão antiga do produto, se necessário. Você também precisa tomar medidas para manter otimizações completas do compilador enquanto gera símbolos. Isso pode ser feito abrindo as propriedades do seu projeto no ambiente de desenvolvimento e, para a configuração de versão, fazendo o seguinte:
- No lado esquerdo da página de propriedades do projeto, clique em C/C++. Por padrão, isso exibe configurações de Geral. No lado direito da página de propriedades do projeto, defina Debug Information Format como Program Database (/Zi).
- No lado esquerdo da página de propriedades, expanda Vinculador e clique em de Depuração. No lado direito da página de propriedades, defina Generate Debug Info como Sim (/DEBUG).
- Clique de Otimização e defina Referências como Eliminar Dados não referenciados (/OPT:REF).
- Defina Ativar de dobragem COMDAT para Remover COMDATs redundantes (/OPT:ICF).
Para obter mais informações, consulte a estrutura MINIDUMP_EXCEPTION_INFORMATION e a funçãoMiniDumpWriteDump.
Usando Dumpchk.exe
Dumpchk.exe é um utilitário de linha de comando que pode ser usado para verificar se um arquivo de despejo foi criado corretamente. Se Dumpchk.exe gerar um erro, o arquivo de despejo está corrompido e não pode ser analisado. Para obter informações sobre como usar o Dumpchk.exe, consulte Como usar o Dumpchk.exe para verificar um arquivo de despejo de memória.
Dumpchk.exe está incluído no CD do produto Windows XP e pode ser instalado no System Drive\Program Files\Support Tools\ by running Setup.exe na pasta Support\Tools\ no CD do produto Windows XP. Você também pode obter a versão mais recente do Dumpchk.exe baixando e instalando as ferramentas de depuração disponíveis em de Ferramentas de Depuração do Windows no Windows Hardware Developer Central.
Analisando um Minidump
Abrir um minidump para análise é tão fácil quanto criar um.
Analisar um minidump
- Abra o Visual Studio.
- No menu Arquivo, clique em Abrir Projeto.
- Defina Arquivos do tipo para Arquivos de despejo, navegue até o arquivo de despejo, selecione-o e clique em Abrir.
- Execute o depurador.
O depurador criará um processo simulado. O processo simulado será interrompido na instrução que causou o acidente.
Usando o Microsoft Public Symbol Server
Para obter a pilha para falhas no nível do driver ou do sistema, pode ser necessário configurar o Visual Studio para apontar para o servidor de símbolos públicos da Microsoft.
Para definir um caminho para o servidor de símbolos da Microsoft
- No menu Depurar, clique em Opções de .
- Na caixa de diálogo Opções de , abra o nó Depuração e clique em Símbolos.
- Certifique-se de Pesquisar os locais acima somente quando os símbolos são carregados manualmente não está selecionado, a menos que você queira carregar símbolos manualmente ao depurar.
- Se você estiver usando símbolos em um servidor de símbolos remoto, poderá melhorar o desempenho especificando um diretório local para o qual os símbolos podem ser copiados. Para fazer isso, insira um caminho para símbolos de cache do servidor de símbolos para este diretório. Para se conectar ao servidor de símbolos públicos da Microsoft, você precisa habilitar essa configuração. Observe que, se você estiver depurando um programa em um computador remoto, o diretório de cache se refere a um diretório no computador remoto.
- Clique OK.
- Como você está usando o servidor de símbolos públicos da Microsoft, uma caixa de diálogo Contrato de Licença de Usuário Final é exibida. Clique Sim para aceitar o contrato e transferir símbolos para a cache local.
Depurando um Minidump com WinDbg
Você também pode usar o WinDbg, um depurador que faz parte das Ferramentas de Depuração do Windows, para depurar um minidump. WinDbg permite que você depurar sem ter que usar o Visual Studio. Para baixar as Ferramentas de Depuração do Windows, consulte Ferramentas de Depuração do Windows no Windows Hardware Developer Central.
Depois de instalar as Ferramentas de Depuração do Windows, você deve inserir o caminho do símbolo no WinDbg.
Para inserir um caminho de símbolo no WinDbg
No menu Arquivo, clique em Caminho do Símbolo.
Na janela Caminho de Pesquisa de Símbolos, digite o seguinte:
"srv\*c:\\cache\*https://msdl.microsoft.com/download/symbols;"
Usando ferramentas Copy-Protection com Minidumps
Os desenvolvedores também precisam estar cientes de como seu esquema de proteção contra cópia pode afetar o minidump. A maioria dos esquemas de proteção contra cópia tem suas próprias ferramentas de descodificação, e cabe ao desenvolvedor aprender a usar essas ferramentas com MiniDumpWriteDump.
Resumo
O função MiniDumpWriteDump pode ser uma ferramenta extremamente útil na coleta e resolução de bugs após o lançamento do produto. Escrever um manipulador de exceção personalizado que usa MiniDumpWriteDump permite que o desenvolvedor personalize a coleta de informações e melhore o processo de depuração. A função é flexível o suficiente para ser usada em qualquer projeto baseado em C++ e deve ser considerada parte do processo de estabilidade de qualquer projeto.