やりたいこと
Releaseビルドの正式リリース版のテスト時に、アプリクラッシュやその他もろもろの障害であたふたしないための準備
以前、正式版のテストで、テスターの方から
- なんかアプリがクラッシュするけど、再現しようとしてもなかなか再現しない。
- テストの終盤で、なんかイベントログに対象アプリのクラッシュログが残ってた。これ大丈夫?
ということがあり、その調査にかなりの時間を取られた。
いずれの場合も、クラッシュしたときの状況は全然覚えてない、という感じなので、状況のヒアリングを念入りに行っても、得られる情報は「たぶん〇〇してたような気がする...」「別になにもしてない(と言っていたが実際はいろいろやってた)」みたいな感じで、不正確なものが多いので、なかなか真相にたどりつかず、えらい苦労した。
そういうことがあっても、エラー発生時の情報を迅速に集められるように、テスト開始前に準備しておきたい。
やること案
今までに得たデバッグ・障害調査ノウハウを全部持ち寄って、かつ、テスターの方の手間にならないようなやり方で準備できれば、かなりの情報を得られると思う。 (準備に手間がかかるという時点で、そもそも準備をやってもらえない、になるので、手間がかからないようにバッチ等を準備したい)
基本、いままでやってきたことの集大成で行けると思う。
下記の知識を引っ張り出してくる。
これまでの知識+α
- WER(WindowsErrorReporting)で、クラッシュ時のダンプを取る
- クラッシュ時のイベントログを取る
- PCにインストールされているドライバのバージョンなどの情報を取る
- PCにインストールされているデスクトップアプリのバージョン
やったこと
事前準備
テストの実施前に、
WERでダンプが取れるようにするためのregファイルを実行しておく。regファイルの中身は下記。
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps] "DumpCount"=dword:00000005 "DumpFolder"="C:\\dumps" "DumpType"=dword:00000002
事後の情報採取
いざアプリのクラッシュ等がおきて、情報を収集するときになったら、上で挙げたようなことを行える下記バッチを実行する。
※バッチファイルはSJISで保存すること
@echo off cd %~dp0 mkdir Data\ echo ダンプを保存しているフォルダをコピー xcopy "C:\dumps" .\Data\\dumps\ /e /y echo イベントログ wevtutil export-log application .\Data\EvtLog_App.evtx wevtutil export-log System .\Data\EvtLog_System.evtx echo 全ドライバのバージョン powershell -command "Get-WmiObject -query 'Select * from Win32_PnPSignedDriver'" 1> .\Data\DriverVersion.txt 2>&1 echo 全デスクトップアプリのバージョン powershell -command "Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion" 1> .\Data\DesktopAppVersion.txt 2>&1 echo パッケージデスクトップアプリのバージョン powershell -command "Get-AppxPackage | select PackageFullName,Version" 1> .\Data\PackageAppVersion.txt 2>&1 echo 指定のフォルダ以下にあるexe/dllファイルのバージョンを取得する powershell -command "Get-ChildItem -Path \"C:\git\PipeJikken\" -Include *.exe, *.dll -Recurse | ForEach-Object { [PSCustomObject]@{ FileName = $_.Name; Version = $_.VersionInfo.FileVersion } } | Format-Table -AutoSize" 1> .\Data\ExeDllFileVersion.txt 2>&1 echo あとその他必要そうなフォルダをコピーする rem xcopy "C:\SomeFolder" .\Data\SomeFolder\ /e /y pause
こんな感じで、一通りほしい情報とれるかな...
あとは、これで採取したダンプをデバッグしたり、ログを解析して、なんとか障害を解決する。