Two­rze­nie zrzu­tów pro­ce­su przez WER-a

• tech • 728 słów • 4 mi­nu­ty czy­ta­nia

Cza­sa­mi de­bu­go­wa­nie wy­wa­la­ją­ce­go się pro­gra­mu jest uciąż­li­we a nawet bo­le­sne. Ostat­nio sam mia­łem taki pa­skud­ny pro­blem z pewną apli­ka­cją UWP (fuuu!). A był to Edge, w któ­rym pro­ces po­tom­ny wor­ke­ra (a może ren­de­re­ra lub co­kol­wiek in­ne­go z su­fik­sem CP w na­zwie) no­to­rycz­nie się wy­wa­lał przy stra­cie, przez co cała apli­ka­cja wy­la­ty­wa­ła szyb­ko w ko­smos. A wszel­kie me­to­dy pod­pię­cia się de­bu­ge­rem lub próby prze­chwy­ce­nia mo­men­tu wy­rzu­ce­nia wy­jąt­ku za­wo­dzi­ły.

W wielu ta­kich oko­licz­no­ściach pro­blem roz­wią­zu­je usta­wie­nie de­bug­ge­ra jako post-​motern[1], bądź sko­rzy­sta­nie z do­bro­dziejstw Image File Exe­cu­tion Options[2], ewen­tu­al­nie stan­dar­do­wo od­pa­lać apli­ka­cję wraz z de­bug­ge­rem[3]. Nie­ste­ty w moim przy­pad­ku wszyst­kie te me­to­dy nie przy­no­si­ły efek­tu, bo albo były igno­ro­wa­ne i WER nadal in­for­mo­wał mnie “że coś złego się wła­śnie stało…”, albo apli­ka­cja z pod­pię­tym de­bug­ge­rem dziw­nie się za­cho­wy­wa­ła lub po pro­stu wy­wa­la­ła się na dzień dobry… nim do­cho­dzi­łem do praw­dzi­we­go pro­ble­mu.

W ta­kiej bez­na­dziej­nej sy­tu­acji za­czą­łem się za­sta­na­wiać czy może sam sza­now­ny Win­dows Error Re­por­ting (WER) nie mógł­by mi tutaj pomoc i wy­ge­ne­ro­wać dumpa przy cra­shu, za­miast swo­je­go ma­ru­dze­nia. Oka­za­ło się, że jest taka moż­li­wo­ści, trze­ba tylko po­grze­bać w re­je­strze, bo do­myśl­nie taka funk­cjo­nal­ność jest wy­łą­czo­na.

Włą­cze­nie i skon­fi­gu­ro­wa­nie tej funk­cji wy­ma­ga do­da­nia klu­cza LocalDumps w re­je­strze:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps]

wraz z usta­wie­niem kilku war­to­ści, z czego naj­waż­niej­sze to DumpType okre­śla­ją­ce ro­dzaj two­rzo­ne­go zrzu­tu pa­mię­ci:

0 - Custom dump
1 - Mini dump
2 - Full dump

Do­myśl­nie pliki będą za­pi­sy­wa­ne w ka­ta­lo­gu %LOCALAPPDATA%\CrashDumps, ale ścież­kę do miej­sca prze­cho­wy­wa­nia można rów­nież usta­wić na do­wol­nie inną w DumpFolder. Wię­cej in­for­ma­cji do zna­le­zie­nia w do­ku­men­ta­cji WER-a: Col­lec­ting User-​Mode Dumps.

Moja szyb­ka kon­fi­gu­ra­cja na ma­szy­nie te­sto­wej ogra­ni­czy­ła się tylko do tych opi­sa­nych wyżej dwóch war­to­ści:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps]
; DumpFolder = C:\dumps\
"DumpFolder"=hex(7):43,00,3a,00,5c,00,64,00,75,00,6d,00,70,00,73,00,5c,00,00,00,00,00
; DumpType = Full
"DumpType"=dword:00000002

dzię­ki czemu wresz­cie do­sta­łem swój wy­cze­ki­wa­ny dump do ana­li­zy ;)

To są usta­wie­nia glo­bal­ne, ale WER umoż­li­wia ogra­ni­cze­nie lub nad­pi­sa­nie tej kon­fi­gu­ra­cji dla wy­bra­nej apli­ka­cji, trze­ba tylko spe­cy­ficz­ne war­to­ści za­pi­sać w pod-​kluczu z nazwą apli­ka­cji/pliku wy­ko­ny­wal­ne­go, na przy­kład: ...\LocalDumps\calc.exe.

Na ko­niec mała cie­ka­wost­ka, mia­no­wi­cie stan­dar­do­wy Me­ne­dżer zadań Win­dows (Task Ma­na­ger) także po­tra­fi utwo­rzyć obraz zrzu­tu pro­ce­su… w menu kon­tek­sto­wym na li­ście pro­ce­sów wid­nie­je opcja Utwórz plik zrzu­tu (Cre­ate Dump File). No kto by po­my­ślał ;)


[[1]](#r1)

Za­szy­ta w sys­te­mie opcja Au­to­ma­tic De­bug­ging umoż­li­wia au­to­ma­tycz­ne uru­cho­mie­nie i pod­łą­cze­nie de­bug­ge­ra do pro­ble­ma­tycz­ne­go pro­ce­su już w chwi­li wy­stą­pie­nia sy­tu­acji wy­jąt­ko­wej (Post Mor­tem De­bug­ging). W roli Post Mor­tem De­bug­ger można wy­ko­rzy­stać do­wol­ny de­bug­ger, na przy­kład WinDbg, i od razu przy cra­shu za­cząć szu­kać przy­czyn wy­sta­pie­nia pro­ble­mu lub inne na­rzę­dzie, na przy­kład Proc­Dump, i zrzu­cać sobie pa­mięć pro­ce­su do pliku do póź­niej­szej ana­li­zy.

Dane o usta­wio­nym na­rzę­dziu i kon­fi­gu­ra­cji za­cho­wa­ne są w re­je­strze w klu­czu:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\]

Ścież­ka do de­bug­ge­ra za­pi­sa­na jest w Debugger i dla przy­kła­do­we­go WinDbg może wy­glą­dać tak:

"<Path>\WinDbg -p %ld -e %ld -g"

Więk­szość de­bug­ge­rów i po­dob­nych na­rzę­dzi mo­gą­cych pra­co­wać w roli Post Mor­tem De­bug­ger po­sia­da od­po­wied­nie funk­cje (w menu lub do­stęp­ne z linii po­le­ceń), które umoż­li­wia­ją szyb­ką i łatwą re­je­stra­cję tool-​a w sys­te­mie, więc nie trze­ba sa­me­mu ręcz­nie grze­bać.

Z da­nych tych ko­rzy­sta WER kiedy coś złego się wy­da­rzy i to on fi­zycz­nie od­pa­la pro­ces de­bug­ge­ra, oczy­wi­ście o ile zo­stał ta­ko­wy przy­pi­sa­ny. Dzia­ła­nie au­to­ma­tycz­ne­go de­bu­go­wa­nia też w ja­kimś stop­niu można kon­fi­gu­ro­wać - Con­fi­gu­ring Au­to­ma­tic De­bug­ging.

[[2]](#r2)

Sys­te­mo­wy me­cha­nizm Image File Exe­cu­tion Options (IFEO) wy­ko­rzy­sty­wa­ny przy de­bu­go­wa­niu za­wie­ra wiele cie­ka­wych funk­cji. Jedną z naj­czę­ściej wy­ko­rzy­sty­wa­nych opcji jest przy­pi­sa­nie do danej apli­ka­cji de­bug­ge­ra, który bę­dzie uru­cha­mia­ny wraz ze star­tem pro­ce­su pro­gra­mu.

Usta­wie­nie de­bug­ge­ra do­ko­nu­je się przez po­da­nie ścież­ki w polu Debugger w kon­fi­gu­ra­cji IEFO, które znaj­du­ją się w re­je­strze i są “po­gru­po­wa­ne” w pod-​kluczach dla każ­dej apli­ka­cji w ga­łę­zi:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\]

Przy­pi­sa­nie WinDbg do sys­te­mo­we­go kal­ku­la­to­ra mo­gło­by zatem wy­glą­dać tak:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\calc.exe]
"Debugger"="<Path>\WinDbg.exe"

Image File Exe­cu­tion Options za­wie­ra wiele cie­ka­wych i przy­dat­nych opcji, a do­dat­ko­wo nie trze­ba kon­fi­gu­ra­cji do­ko­ny­wać po­przez ręcz­ną edy­cję re­je­stru - ist­nie­je do tego spe­cjal­ny pro­gram gflags, z któ­re­go można sko­rzy­stać.

[[3]](#r3)

Uru­cho­mie­nie apli­ka­cji UWP jest nieco od­mien­ne od in­nych ty­po­wych pro­gra­mów Win32 i pli­ków wy­ko­ny­wal­nych PE. O ile w .net był to pra­wie zwy­kły PE z od­po­wied­nim En­try­Po­in­tem, to przy UWP jest znacz­nie wię­cej za­ba­wy. A tym samym skut­ku­je to tym, że próba uru­cho­mie­nia apli­ka­cji spod de­bug­ge­ra nie na­le­ży do pro­stych i oczy­wi­stych rze­czy.

Na szczę­ście WinDbg wzbo­ga­cił się o taką moż­li­wość:

windbg.exe -plmPackage <PLMPackageName> -plmApp <ApplicationId> [<parameters>]

Szcze­gó­ły w do­ku­men­ta­cji de­bug­ge­ra: De­bug­ging a UWP app using WinDbg.

Ko­men­ta­rze (0)

Dodaj ko­men­tarz

/do­zwo­lo­ny mark­down/

/nie zo­sta­nie opu­bli­ko­wa­ny/