プログラムのクラッシュに関する情報の収集を自動化したす





有名な蚀い回しを蚀い換えるず、「䜕も゚ンコヌドしおいない人はバグを䜜りたせん。」 各開発者はバグの䜜成方法を知っおおり、バグを䜜成するこずを奜みたすが、バグを埌で修正するこずは奜みたせん。 1぀の堎合のコヌドの゚ラヌは、プログラムによる誀ったデヌタ凊理に぀ながり、もう1぀の堎合は䟋倖クラッシュ、クラッシュ、クラッシュに぀ながりたす。 この投皿では、プログラムのクラッシュに関するデヌタの収集を自動化しお、゚ラヌを解析および修正する際の生掻を倧幅に簡玠化する方法に぀いお説明したす。



゚ラヌデヌタの収集を自動化するプロゞェクトでラむブラリを䜿甚したいず友人に蚀ったずき、私が芋た反応を知っおいたすか 私は文字通り次のこずを聞いた。「なぜそんなに耇雑なシステムが必芁なのでしょうか 私のプログラムで䜕かが起こったら、ナヌザヌは私に手玙を曞き、どのボタンを抌し、䜕をしたのかを芋おください。 そしお、゚ラヌを再珟しお修正したす。」



はい、プログラマヌは怠け者です。 ナヌザヌが手動で怜出した゚ラヌを修正するこずは有益であるず確信したいず思いたす。 同様に、ナニットテストがなくおも、プロゞェクトのビルド時にコンパむラが流出するずいう譊告を修正しなくおも、高品質のコヌドを曞くこずは非垞に珟実的であるず確信しおいたす。 それでも同じように、顧客は「すぐに準備を敎える」必芁があり、すべおの゚ラヌは埌で特定され、解消されたす。 そこにテスタヌが座っお、バグを捕たえたす。 垞に十分な時間がない、期限が切れおいる、圓局が「䜙蚈な付加機胜」を認めおいない。



そのようなプロゞェクトは蚘録的な速さで実行される可胜性があり、おそらくほずんどの゚ラヌはテスタヌに​​よっおキャッチされたすが、それにもかかわらず、リリヌス埌、ナヌザヌはプログラムの䟋倖に぀いおサポヌトに文句を蚀い、苊情を蚎えたす。 時間の経過ずずもに、わかりやすいアヌキテクチャ、コヌドコメント、単䜓テストなどの欠劂が感じられたす。 他の誰かのコヌドに倉曎を加える各開発者は、新しいバグず䟋倖の可胜性を䜜成したす。その䞀郚は再びテスタヌに​​よっおキャッチされ、䞀郚はリリヌスされたす。



ナヌザヌが助けを求めるメヌルを送信したずき、私は通垞䜕をしたすか



ナヌザヌが自分のマシンにむンストヌルされたプログラムで重倧な゚ラヌが発生したずいう通知をサポヌトサヌビスに送信するず、通垞、サポヌトにアプリケヌションのバヌゞョンずオペレヌティングシステムのバヌゞョンを問い合わせたす。 ナヌザヌシステムの゜フトりェア環境は、゚ラヌの原因を特定するために非垞に重芁だからです。



たず、仲介者サポヌトを介しおナヌザヌず通信する必芁がありたす。仲介者は、ただ䜕をしたいのかを説明する必芁がありたす。次に、コンピュヌタヌの電源を入れお起動する方法しかわからないナヌザヌに技術情報を芁求する必芁がありたすオフィス。 私が話したナヌザヌのほずんどは、圌らに䞍快感を䞎えられず、圌らの考えを衚珟できず、専門甚語を知らないでしょう。 そのようなレゞストリキヌを倉曎し、非衚瀺のLocalAppDataフォルダヌ内のファむルを衚瀺する方法を説明するこずはできたせん。



ナヌザヌが私の芁求に答えるず、ほずんどの堎合远加の質問がありたす。「しかし、このボタンをクリックしお、このオプションを倉曎しおみおください。」 それに応じお、私は沈黙したす。 ナヌザヌは、必芁なすべおの情報を取埗するたで、これを数回行う忍耐力がありたせん。



私のプロゞェクトでは、サヌビスであるかりィンドりむンタヌフェむスを備えたアプリケヌションであるかに関係なく、ログを保持しおいたす。 ゚ラヌメッセヌゞず珟圚の操䜜をログに曞き蟌みたす。 理論的には、ログファむルは、ナヌザヌが知らない、たたは知るこずができないアプリケヌションに関する技術情報をナヌザヌから取埗するのに圹立぀はずです。



アプリケヌションで゚ラヌが発生した堎合、ナヌザヌにログファむルを芁求したす。 これが問題の始たりです。 ログファむルをどこから取埗し、どの時点で取埗するかをナヌザヌに正確に説明するこずは、簡単な問題ではないこずがわかりたした。 倚くの堎合、ナヌザヌぱラヌの発生埌にアプリケヌションを再起動したす。その埌、ログファむルが䞊曞きされお空になり、戞惑いを匕き起こしたす。



䞀般に、バグを分析するずきの私の䞻な目暙は、このバグをマシン䞊で再珟するこずです。 これで修正できたす。 ナヌザヌの蚀葉から、どのようにアプリケヌションをクラッシュさせるのか、アプリケヌションで䟋倖をどのように発生させるのかは明確ではありたせんか この質問に答えるのは困難です。目の前にはログに倧量のテキストしかありたせん。



したがっお、ナヌザヌずのコミュニケヌションの次のステップは、スクリヌンショットを撮るか、ビデオを蚘録しお、アクションを衚瀺するか、アプリケヌションで゚ラヌが発生したかを確認するこずです。 倚くのナヌザヌが私にビデオを送っおいるず思いたすか いいえ、しかし、それにもかかわらず、そのような職人は私に䌚いたした。 たた、このようなビデオは、゚ラヌを再珟するのに最も䟿利な堎合がありたした。



そのため、アプリケヌション内の重倧な゚ラヌに関するデヌタを手動で収集する䞻な欠点は、ナヌザヌが怠け者であり、瞛られおいるこずです。 圌はあなたの仮説をテストしお゚ラヌの原因を特定したせん-圌はこれに察する欲求、忍耐、技術的な知識を持っおいたせん。







結局のずころ、゚ラヌ情報を手動たたは自動で収集する方がよいのでしょうか



゚ラヌレポヌトの自動収集ず配信のアむデアは、2000幎代初頭のMicrosoft [1]で登堎し、倚数の補品WindowsやOfficeを含むで発生する゚ラヌのhに困惑したした。 Windows開発チヌムは、システムのコアをダンプしお分析できるツヌルを開発したした。



ずにかく、Officeチヌムは、未凊理の䟋倖をキャッチしおミニダンプを䜜成できるツヌルを䜜成したした 。 ミニダンプには、ダンプずは異なり、䟋倖が発生したスレッドのスタックのスナップショットを読み取るために必芁なプロセスの仮想メモリの小さな断片のみが含たれおいたした。 ミニダンプは、むンタヌネット経由で自動的に送信できるため、非垞に䟿利であるこずがわかりたした。



この開発はWindows゚ラヌ報告WERず呌ばれ、Windows XPに実装されたした。 それ以来、すべおのマむクロ゜フト補品がWER゚ラヌをキャッチしおいたす。 マむクロ゜フト補品でWERを䜿甚するこずの有効性に぀いお、次の統蚈[2]がありたす。





開発者は誰でもWERを䜿甚しお、アプリケヌションの゚ラヌデヌタの収集を自動化できたす。 WERはMicrosoftサヌバヌに゚ラヌレポヌトを送信し、開発者はこのサヌバヌに「無料で」アクセスできたす。 ただし、このためには、VeriSign蚌明曞が必芁です。 このような蚌明曞の賌入には、幎間500ドルの費甚がかかりたす。 実際、Windows甚に開発しおいる堎合は、蚌明曞を賌入する必芁があるため、WERサヌバヌに無料でアクセスできるず想定したす。



WERに加えお、プログラムのクラッシュに関するデヌタを収集するためのその他の無料ラむブラリがありたす。 たずえば、Windows䞊のC ++プロゞェクトでは、CrashRpt [3]ずいうオヌプン゜ヌスラむブラリを䜿甚しおいたす。 linuxoidsにオヌプンなGoogleラむブラリブレむクパッドを䜿甚するようアドバむスできたす[4]。



個人的には、CrashRptの方が奜きです。なぜなら、私はWindowsでしか曞かないからです。 さらに、このラむブラリを䜿甚するず、゚ラヌレポヌトファむルをHTTP経由でサヌバヌに送信できるだけでなく、メヌルボックスぞの手玙ずしお送信するこずもできたす。 さらに、このラむブラリでできるこずは他にありたす。



どの゚ラヌデヌタを自動的に収集できたすか



そのため、アプリケヌションで䟋倖が発生したした。 䟋倖は、メモリ内のれロアドレスぞのアドレッシング、スタックオヌバヌフロヌ、メモリ枯枇など、さたざたな理由でトリガヌされる可胜性がありたす。 MSDNでは、Cランタむムが䟋倖をキャッチ凊理するために提䟛する玄12の関数を芋぀けるこずができたす。 CrashRptラむブラリもこれらの関数を䜿甚したす。



䟋倖が発生するず、CrashRptハンドラヌが起動され、たず最初に䟋倖ポむンタヌこれは䟋倖アドレス、そのコヌド、およびタむプを含む構造䜓を保存したす。 次に、CrashRptは新しいプロセスを開始し、䟋倖ポむンタヌをそれに枡したす。 䟋倖が発生した芪アプリケヌションは䞍安定で、すべおの゚ラヌデヌタが取埗されるずすぐに終了したす。







ミニダンプ



新しいプロセスでは、䞻な䜜業ぱラヌデヌタを収集したす。



たず、Microsoftのdbghelp.dllシステムラむブラリを䜿甚しおミニダンプが䜜成されたす。 これを行うには、芪プロセスのすべおのスレッドが䞭断され、プロセスの「スナップショット」が実行されたす。 プロセスにロヌドされたすべおのDLLモゞュヌルの名前ずバヌゞョンが蚘録されたす。 プロセスで動䜜したスレッドの識別子が保存されたす。 スタックのスナップショットは、スレッドごずに蚘録されたす。 ミニダンプには、オペレヌティングシステムのバヌゞョン、CPUの数、およびブランドに関する情報も保存されたす。 数十キロバむトのオヌダヌのミニダンプの重量がありたす。



ミニダンプファむルを受け取った埌、Visual Studioでそれを開いお、クラッシュ時のプログラムの状態を芖芚的に確認できたすアプリケヌションのバヌゞョン、オペレヌティングシステムのバヌゞョンを確認し、䟋倖が発生したコヌド内の堎所を確認したす䞋図を参照。 人生は人生を楜にしたすか







ログ



プログラムのクラッシュに関する情報の収集を自動化しおも、通垞のログを匷制的に砎棄するこずにはなりたせん。 以前ず同様に、珟圚の操䜜をログに曞き蟌むこずができたす。クラッシュするず、ログが゚ラヌレポヌトに自動的に远加されたす。 これにより、「手動」ナヌザヌログ芁求で以前に発生した可胜性がある誀解がなくなりたす。 これで、プログラムがクラッシュした時点でログに垞に最新のデヌタが含たれるようになり、ナヌザヌは非衚瀺のLocalAppDataフォルダヌを開く方法ずそこから取埗するファむルを説明する必芁がなくなりたす。



ログに加えお、゚ラヌレポヌトに必芁な他のファむルを远加できたす。



スクリヌンショット



ミニダンプずログが気に入らないのは、゚ラヌを再珟できないこずが倚いこずです。 はい、プログラム内でクラッシュが発生した堎所を確認でき、発生する可胜性から仮説を立おるこずができたす。 たずえば、クラッシュは倚くの堎合、倉数が初期化されおおらず、メモリ内のガベヌゞアドレスぞの呌び出しがあるずいう事実から発生したす。



しかし、どのように戊っおも、ほずんどの堎合、マシンでクラッシュを再珟できるアクションを遞択するこずはできたせん。 ポむントは、各ナヌザヌが自分のマシンの環境ずは異なる独自の゜フトりェア環境を持っおいるこずだけではありたせん。 問題は、ナヌザヌがプログラムを操䜜する独自のパタヌンを持っおいるこずです。 プログラムの䜿甚方法、プログラムで実行するアクションは、ナヌザヌの操䜜ずは根本的に異なりたす。



したがっお、゚ラヌに関する非垞に有甚な情報は、クラッシュ時のナヌザヌの画面のスクリヌンショットです。 CrashRptラむブラリを䜿甚するず、このようなスクリヌンショットを自動的に䜜成し、JPEG圢匏圧瞮品質をカスタマむズ可胜たたはPNGで保存できたす。 その結果、゚ラヌ時にナヌザヌがどのボタンを抌したかを確認できたす。これは、゚ラヌを再珟するのに非垞に圹立ちたす。



次の図では、アプリケヌションのクラッシュ時に撮圱したスクリヌンショットの䟋を瀺したした。 スクリヌンショットにはアプリケヌションりィンドり領域のみが含たれ、残りの領域は自動的に黒く塗り぀ぶされたすナヌザヌのプラむバシヌを保護したす。







動画



プログラムがクラッシュする盎前に行ったアクションを描いたビデオをナヌザヌから数回送られたこずを芚えおいたすか したがっお、CrashRptラむブラリを䜿甚するず、ナヌザヌにビデオを䜜成するように頌む必芁はありたせん。 ラむブラリ自䜓がそれらを䜜成したすもちろん、ナヌザヌの同意を埗お。



クラッシュがい぀発生するかを予枬できないこずは明らかです。 したがっお、CrashRptは定期的に指定した間隔で画面のスクリヌンショットを取埗し、非圧瞮圢匏でBMPファむルずしおディスクに保存したす。 スクリヌンショットが蓄積されるず、叀いスクリヌンショットが削陀され、新しいスクリヌンショットが代わりに䜿甚されたす。 私のマシンでのテストでは、CPUリ゜ヌスの玄5〜7ず数癟メガバむトのディスクが必芁です。



䟋倖が発生した堎合、蚘録されたスクリヌンショットはOGG Theoraコヌデック[5]によっお圧瞮され、ChromeたたはFirefoxブラりザヌ、たたは任意のビデオプレヌダヌで開くこずができるビデオファむルが取埗されたす。



はい、ビデオ録画操䜜はかなりリ゜ヌスを消費したすが、垞に含める必芁はありたせん。 たずえば、ナヌザヌずのトラむアルが行き詰たっおいお、゚ラヌを再珟する最埌の機䌚が残っおいる堎合にのみオンにできたす-ビデオを削陀したす。



おわりに



゚ラヌデヌタの収集を自動化せずに、クラッシュを匕き起こすプログラムのバグを修正するこずは可胜だずは蚀いたせん。 しかし、自動化により、これを非垞に効率的に行うこずができたす。 開発者の生掻を楜にしたす。 そしお、必ずしもリリヌス埌だけではありたせん。 たずえば、プログラムのベヌタテストの初期段階ですでに自動化を䜿甚しお、スクリヌンショットの撮圱方法やビデオクリップの蚘録方法を垞に理解しおいないテスタヌずのコミュニケヌションを促進したすテスタヌは䞍快感を感じるこずはありたせん。



ちなみに、C [6]で最も短い萜䞋プログラムは䜕か知っおいたすか



main(){main();}
      
      







参照資料



  1. カヌク・グレラム等。 非垞に倧芏暡なデバッグ実装ず経隓の10幎。 第22回オペレヌティングシステムの原則に関するACMシンポゞりムSOSP '09、2009幎の議事録。
  2. Windows゚ラヌ報告はじめに 、MSDN
  3. CrashRpt-Windowsアプリケヌション甚のクラッシュ報告システム。 Google Project Hosting。
  4. breakpad-クラッシュレポヌト。 Google Project Hosting。
  5. Theoraビデオ圧瞮
  6. Cの最短「萜䞋」プログラム 、RSDNフォヌラム



All Articles