Crashdumpanalyse
Niet alle bugs zijn te vinden vóór de release, wat betekent dat niet alle bugs die uitzonderingen genereren, kunnen worden gevonden vóór de release. Gelukkig heeft Microsoft in de Platform SDK een functie opgenomen om ontwikkelaars te helpen informatie te verzamelen over uitzonderingen die door gebruikers worden gedetecteerd. De MiniDumpWriteDump-functie schrijft de benodigde crashdumpgegevens naar een bestand zonder de hele procesruimte op te slaan. Dit crashdumpinformatiebestand wordt een minidump genoemd. Dit technische artikel bevat informatie over het schrijven en gebruiken van een minidump.
- een minidump schrijven
- Thread-
- een minidump schrijven met code
- Dumpchk.exe gebruiken
- een minidump analyseren
- Samenvattings-
Een minidump schrijven
De basisopties voor het schrijven van een minidump zijn als volgt:
Doe niets. Windows genereert automatisch een minidump wanneer een programma een onverwerkte uitzondering genereert. Automatische generatie van een minidump is beschikbaar sinds Windows XP. Als de gebruiker dit toestaat, wordt de minidump verzonden naar Microsoft en niet naar de ontwikkelaar, via Windows Error Reporting (WER). Ontwikkelaars kunnen toegang krijgen tot deze minidumps via het Windows-bureaubladtoepassingsprogramma.
Voor het gebruik van WER is het volgende vereist:
- Ontwikkelaars om hun toepassingen te ondertekenen met Authenticode
- Toepassingen hebben een geldige VERSIONINFO-resource in elk uitvoerbaar bestand en DLL
Als u een aangepaste routine implementeert voor niet-verwerkte uitzonderingen, wordt u sterk aangeraden de functie ReportFault in de uitzonderingshandler te gebruiken om ook een geautomatiseerde minidump naar WER te verzenden. De functie ReportFault verwerkt alle problemen van het maken van verbinding met en het verzenden van de minidump naar WER. Het niet verzenden van minidumps naar WER voldoet aan de vereisten van Games voor Windows.
Zie Windows Error Reportingvoor meer informatie over WER.
Gebruik een product uit het Microsoft Visual Studio Team System. Klik in het menu Foutopsporing op Dump opslaan als om een kopie van een dump op te slaan. Het gebruik van een lokaal opgeslagen dump is alleen een optie voor intern testen en foutopsporing.
Voeg code toe aan uw project. Voeg de MiniDumpWriteDump-functie toe en de juiste code voor het verwerken van uitzonderingen om een minidump rechtstreeks naar de ontwikkelaar op te slaan en te verzenden. In dit artikel wordt beschreven hoe u deze optie implementeert. Houd er echter rekening mee dat MiniDumpWriteDump- momenteel niet werkt met beheerde code en alleen beschikbaar is in Windows XP, Windows Vista, Windows 7.
Schroefdraadveiligheid
MiniDumpWriteDump- maakt deel uit van de BIBLIOTHEEK DBGHELP. Deze bibliotheek is niet thread-safe, dus elk programma dat gebruikmaakt van MiniDumpWriteDump moet alle threads synchroniseren voordat u probeert MiniDumpWriteDumpaan te roepen.
Een minidump schrijven met code
De daadwerkelijke implementatie is eenvoudig. Hier volgt een eenvoudig voorbeeld van het gebruik van 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()))
{
}
}
In dit voorbeeld ziet u het basisgebruik van MiniDumpWriteDump en de minimale informatie die nodig is om deze aan te roepen. De naam van het dumpbestand is aan de ontwikkelaar. Om conflicten tussen bestandsnaamen te voorkomen, is het echter raadzaam om de bestandsnaam te genereren op basis van de naam en het versienummer van de toepassing, de proces- en thread-id's en de datum en tijd. Dit helpt ook om de minidumps gegroepeerd te houden op toepassing en versie. Het is aan de ontwikkelaar om te bepalen hoeveel informatie wordt gebruikt om namen van minidump-bestanden te onderscheiden.
Er moet worden opgemerkt dat de padnaam in het vorige voorbeeld is gegenereerd door de functie GetTempPath- aan te roepen om het pad van de map op te halen die is aangewezen voor tijdelijke bestanden. Het gebruik van deze map werkt zelfs met gebruikersaccounts met minimale bevoegdheden en voorkomt ook dat de minidump ruimte op de harde schijf in beslag neemt nadat deze niet meer nodig is.
Als u het product tijdens het dagelijkse buildproces archiveert, moet u ook symbolen voor de build opnemen, zodat u indien nodig fouten kunt opsporen in een oude versie van het product. U moet ook stappen ondernemen om volledige compileroptimalisaties te onderhouden tijdens het genereren van symbolen. U kunt dit doen door de eigenschappen van uw project te openen in de ontwikkelomgeving en, voor de releaseconfiguratie, het volgende te doen:
- Klik aan de linkerkant van de eigenschappenpagina van het project op C/C++. Standaard worden instellingen voor algemeen weergegeven. Stel aan de rechterkant van de eigenschappenpagina van het project Foutopsporingsgegevensindeling in op Program Database (/Zi).
- Vouw aan de linkerkant van de eigenschappenpagina Linkeruit en klik vervolgens op Foutopsporing. Stel aan de rechterkant van de eigenschappenpagina Foutopsporingsgegevens genereren in op Ja -(/DEBUG).
- Klik op Optimizationen stel References in op Eliminate Unreferenced Data (/OPT:REF).
- Stel COMDAT Folding- inschakelen om redundante COMDAT's (/OPT:ICF) te verwijderen.
Zie de MINIDUMP_EXCEPTION_INFORMATION structuur en de functie MiniDumpWriteDump voor meer informatie.
Dumpchk.exe gebruiken
Dumpchk.exe is een opdrachtregelprogramma dat kan worden gebruikt om te controleren of er een dumpbestand juist is gemaakt. Als Dumpchk.exe een fout genereert, is het dumpbestand beschadigd en kan het niet worden geanalyseerd. Zie How to Use Dumpchk.exe to Check a Memory Dump Filevoor meer informatie over het gebruik van Dumpchk.exe.
Dumpchk.exe is opgenomen op de Windows XP-product-CD en kan worden geïnstalleerd op System Drive\Program Files\Support Tools\ by running Setup.exe in de map Support\Tools\ op de Windows XP-product-CD. U kunt ook de nieuwste versie van Dumpchk.exe downloaden en installeren van de hulpprogramma's voor foutopsporing die beschikbaar zijn via Hulpprogramma's voor Windows-foutopsporing op Windows Hardware Developer Central-.
Een minidump analyseren
Het openen van een minidump voor analyse is net zo eenvoudig als het maken van een minidump.
Een minidump analyseren
- Open Visual Studio.
- Klik in het menu Bestand op Project openen.
- Stel bestanden van het type in op dumpbestanden, navigeer naar het dumpbestand, selecteer het en klik op Openen.
- Voer het foutopsporingsprogramma uit.
Het foutopsporingsprogramma maakt een gesimuleerd proces. Het gesimuleerde proces wordt gestopt bij de instructie die de crash heeft veroorzaakt.
De openbare symboolserver van Microsoft gebruiken
Als u de stack wilt ophalen voor crashes op stuurprogramma- of systeemniveau, moet u Visual Studio mogelijk configureren om te verwijzen naar de openbare symboolserver van Microsoft.
Een pad naar de Microsoft-symboolserver instellen
- Klik in het menu Foutopsporing op Opties.
- Open in het dialoogvenster Opties het knooppunt Foutopsporing en klik op Symbolen.
- Zorg ervoor dat de bovenstaande locaties alleen doorzoeken wanneer symbolen handmatig worden geladen niet is geselecteerd, tenzij u symbolen handmatig wilt laden wanneer u fouten opssporing uitvoert.
- Als u symbolen op een externe symboolserver gebruikt, kunt u de prestaties verbeteren door een lokale map op te geven waarnaar symbolen kunnen worden gekopieerd. Voer hiervoor een pad in voor cachesymbolen van de symboolserver naar deze map. Als u verbinding wilt maken met de openbare symboolserver van Microsoft, moet u deze instelling inschakelen. Als u fouten in een programma op een externe computer opspoort, verwijst de cachemap naar een map op de externe computer.
- Klik op OK-.
- Omdat u de openbare symboolserver van Microsoft gebruikt, wordt het dialoogvenster Gebruiksrechtovereenkomst weergegeven. Klik op Ja om de overeenkomst te accepteren en symbolen naar uw lokale cache te downloaden.
Fouten opsporen in een Minidump met WinDbg
U kunt ook WinDbg, een foutopsporingsprogramma dat deel uitmaakt van de Windows-foutopsporingsprogramma's, gebruiken om fouten in een minidump op te sporen. Met WinDbg kunt u fouten opsporen zonder Visual Studio te hoeven gebruiken. Zie Windows-foutopsporingsprogramma's op Windows Hardware Developer Central-om Windows-hulpprogramma's voor foutopsporing te downloaden.
Nadat u Windows Foutopsporingsprogramma's hebt geïnstalleerd, moet u het symboolpad invoeren in WinDbg.
Een symboolpad invoeren in WinDbg-
Klik in het menu Bestand op symboolpad.
Voer in het venster zoekpad voor symbolen het volgende in:
"srv\*c:\\cache\*https://msdl.microsoft.com/download/symbols;"
Hulpprogramma's voor Copy-Protection gebruiken met Minidumps
Ontwikkelaars moeten ook weten hoe hun kopieerbeveiligingsschema van invloed kan zijn op de minidump. De meeste kopieerbeveiligingsschema's hebben hun eigen ontscramble hulpprogramma's en het is aan de ontwikkelaar om te leren hoe u deze hulpprogramma's kunt gebruiken met MiniDumpWriteDump-.
Samenvatting
De MiniDumpWriteDump functie kan een zeer nuttig hulpmiddel zijn bij het verzamelen en oplossen van bugs nadat het product is vrijgegeven. Door een aangepaste uitzonderingshandler te schrijven die gebruikmaakt van MiniDumpWriteDump kan de ontwikkelaar de informatieverzameling aanpassen en het foutopsporingsproces verbeteren. De functie is flexibel genoeg om te worden gebruikt in elk op C++gebaseerd project en moet worden beschouwd als onderdeel van het stabiliteitsproces van een project.