Fri
03
Oct 2008
Życie programu w Windows nie kończy się wraz z błędem ochrony pamięci albo dzieleniem przez zero. Takie błędy można łapać, a co więcej, można z nich tworzyć tzw. Crash Dump - plik DMP, który wysłany do programisty może mu pomóc zlokalizować problem.
Należy objąć swój kod w sekcję __try { ... } __except ( MojaFunkcja( GetExceptionInformation() ) ) { }
, a w swojej funkcji wywołać MiniDumpWriteDump pochodzącą z biblioteki Dbghelp. Ta biblioteka z kolei rozprowadzana jest jako Debugging Tools for Windows, ale do użycia tej funkcji wystarczy wersja domyślna z Windows XP.
Potem plik DMP można otworzyć w Visual C++ (rozszerzenie jest z nim domyślnie skojarzone). Trzeba jeszcze posiadać plik PDB z symbolami (powstaje w czasie kompilacji obok EXE/DLL) i już można zobaczyć gdzie wystąpił błąd, analizując np. stos wywołań Call Stack. Można nawet ściągnąć symbole do bibliotek systemowych. Ścieżki do symboli ustawia się w Tools > Options > Debugging > Symbols, lokalizacja z symbolami od bibliotek systemowych to http://msdl.microsoft.com/download/symbols.
Niestety sprawa nie jest taka prosta. Dodatkowo można na przykład postawić tzw. "Symbol Server" (to po prostu specjalny katalog zarządzany przez dedykowane programy z pakietu Debugging Tools for Windows), a podczas używania tych mechanizmów pojawia się wiele problemów (może ktoś coś poradzi na mój problem? :)