Crash Dump
décembre 29th, 2006 at 04:42 admin
Yo, c’est nowel alors je poste un petit code avec lequel vous pourrez jouer
pendant les vacs. Vous le savez lorsque un programme sous Windows plante il
demande si vous voulez envoyer un rapport à MS. Mais c’est quoi ce rapport ffs
?! C’est tout simplement un Crash Dump de votre programme qui à planté, un
fichier qui contient des infos sur le process, ses threads, les dll loadées,
l’OS etc …
Pour avoir notre propre crash dump c’est simple, il suffit d’utiliser l’API
MiniDumpWriteDump() de Dbghelp.dll fournit avec les debugging tools de Windows
et dispo gratos sur leur site. Après c’est tout con, on dit au gestionnaire
d’exceptions de lancer notre fonction en cas d’exception non gérée (vous savez
le msg qui dit que votre prog à teplan) puis de crée le dump.
————CUT HERE——————–
#include#include #include //pour linker avec la lib #pragma comment (lib, "Dbghelp.lib") /* exception non gérée, on crée un dump */ LONG WINAPI UnhandledExceptionDump(struct _EXCEPTION_POINTERS* ExceptionInfo) { HANDLE hFile; _MINIDUMP_EXCEPTION_INFORMATION ExceptInfo; hFile=CreateFile("C:ExceptDump.dmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); ExceptInfo.ThreadId=GetCurrentThreadId(); ExceptInfo.ExceptionPointers=ExceptionInfo; ExceptInfo.ClientPointers=NULL; MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExceptInfo, NULL, NULL); CloseHandle(hFile); //termine le programme en affichant la msgbox 'le prog à teplan' return EXCEPTION_CONTINUE_SEARCH; } int main(int argc, char *argv[]) { // filtre les execpt non handlé SetUnhandledExceptionFilter(UnhandledExceptionDump); // exception *((PBYTE)0)=1; return 0; }
————CUT HERE——————–
Now qu’on a le dump. Il suffit de l’analyser, avec Windbg par exemple
(Minidump est le nom de mon .exe)
0:000> !analyze -v ******************************************************************************* * * * Exception Analysis * * * *******************************************************************************FAULTING_IP: MiniDump+920 00400920 c6050000000001 mov byte ptr ds:[0],1 EXCEPTION_RECORD: ffffffff -- (.exr ffffffffffffffff) ExceptionAddress: 00400920 (MiniDump+0x00000920) ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000000 NumberParameters: 2 Parameter[0]: 00000001 Parameter[1]: 00000000 Attempt to write to address 00000000 DEFAULT_BUCKET_ID: NULL_DEREFERENCE PROCESS_NAME: MiniDump.exe ERROR_CODE: (NTSTATUS) 0xc0000005 - L'instruction "0x%08lx" emploie l'adresse mémoire "0x%08lx". La mémoire ne peut pas être "%s". WRITE_ADDRESS: 00000000 BUGCHECK_STR: ACCESS_VIOLATION LAST_CONTROL_TRANSFER: from 004009e6 to 00400920 STACK_TEXT: WARNING: Stack unwind information not available. Following frames may be wrong. 0012ff80 004009e6 00000001 00510ed0 00510e30 MiniDump+0x920 0012ffc0 7c816fd7 00000018 00000000 7ffdf000 MiniDump+0x9e6 0012fff0 00000000 00400932 00000000 00000000 kernel32!BaseProcessStart+0x23 STACK_COMMAND: ~0s; .ecxr ; kb FAULTING_THREAD: 0000048c FOLLOWUP_IP: MiniDump+920 00400920 c6050000000001 mov byte ptr ds:[0],1 SYMBOL_STACK_INDEX: 0 SYMBOL_NAME: MiniDump+920 FOLLOWUP_NAME: MachineOwner MODULE_NAME: MiniDump IMAGE_NAME: MiniDump.exe DEBUG_FLR_IMAGE_TIMESTAMP: 458e997b FAILURE_BUCKET_ID: ACCESS_VIOLATION_MiniDump+920 BUCKET_ID: ACCESS_VIOLATION_MiniDump+920 Followup: MachineOwner ---------
On a l’instruction ou a teplan le prog :
00400920 c6050000000001 mov byte ptr ds:[0],1
Après pour ceux qui ont pas Windbg j’ai trouvé un tool en surfant je vous le
donne :
http://www.debuginfo.com/tools/minidumpview.html
En fait il fonctionne avec l’API MiniDumpReadDumpStream() pour aller récup les
infos dans le fichier.
Tout est documenté sur le SDK, amusez vous bien.
Sur ce, bon noel à tous et vous bourrez pas trop la gueule :=]
Ivanlef0u
Entry Filed under: Non classé
Trackback this post