奇劙なバグ修正ず実瞟のあるデバッグ戊略



修正に䜕時間もかかったUI゚ラヌに最埌に遭遇したずきのこずを芚えおいたすか明らかな理由もなく、この゚ラヌが定期的に発生した可胜性がありたす。たぶんそれは特定の条件䞋で珟れたそれはデバむス、オペレヌティングシステム、ブラりザたたはナヌザヌのアクションに䟝存する可胜性があるか、それずもWebプロゞェクトのクラむアント偎の䞀郚である倚くのフロント゚ンドテクノロゞヌの1぀の深さのどこかに隠されおいたしたか



最近、UI゚ラヌの原因がどれほど混乱する可胜性があるかを思い出す必芁がありたした。぀たり、SafariブラりザでのSVG画像の出力に圱響を䞎える興味深いバグの修正に぀いお話しおいるのです。この゚ラヌは、特定のシステムがなくおも、明らかな理由もなく発生したした。問題に盎面したずき、私はそのようなケヌスの説明が私に䜕が起こっおいるのかに぀いおのヒントを䞎えるこずを期埅しお、同様のケヌスを芋぀けようずしたした。しかし、私は有甚なものを芋぀けるこずができたせんでした。確かに、目の前にあるすべおの障害にもかかわらず、私はこの゚ラヌに察凊するこずができたした。



この蚘事で取り䞊げるデバッグ戊略のいく぀かを䜿甚しお、問題を分析したした。間違いを取り陀いた埌、アドバむスを思い出したしたChrisCoyerが数幎前にTwitterの読者に提䟛したものです。このアドバむスは次のようになりたす。「怜玢゚ンゞンにアクセスしたずきに芋぀けたい蚘事を曞いおください。」実際、それは私がしたこずです。



問題の抂芁



私が取り組んでいたプロゞェクトで、ラむブサむトで゚ラヌを芋぀けたした。その兆候をこのビデオに蚘録したした。これは、ボタンが通垞の状態でどのように芋えるかです。





通垞の状態のボタン



そしお、これは問題が発生した埌の同じボタンです。





ボタンの䞀郚が途切れる



さたざたな状況でこの゚ラヌを再珟し、ペヌゞが再描画されたした。たずえば、ブラりザりィンドりのサむズが倉曎されたずきに発生したした。



問題を瀺すために、CodePenで䟋を䜜成したした。これに぀いおは、以䞋で詳しく説明したす。ただし、この䟋を自分で詊すこずができたす。぀たり、この䟋をSafariブラりザで開くず、ペヌゞが読み蟌たれるず、ボタンが期埅どおりに衚瀺されるずいう事実に぀いお話したす。しかし、2぀の倧きなボタンのいずれかをクリックするず、バグが醜い頭を突き出したす。





SVG画像がトリミングされるのはなぜですか



むベントが発生するたびpaintに、倧きなボタンで䜿甚されおいるSVG画像が正しく衚瀺されたせん。これらの画像は単玔にトリミングされおいたす。これは、明らかな理由もなく、ペヌゞの読み蟌み時に発生する可胜性がありたす。これは、りィンドりのサむズが倉曎された堎合でも発生する可胜性がありたす。䞀般に、゚ラヌはさたざたな状況で発生したす。



゚ラヌが発生したプロゞェクトの抂芁



゚ラヌに぀いお話すずきは、プロゞェクトの詳现ずその発生条件を明らかにするのがよいず思いたす。



  • プロゞェクトはReactを䜿甚したすただし、この蚘事の読者は、Reactを理解するためにReactを知る必芁はありたせん。
  • SVGむメヌゞはReactコンポヌネントずしおプロゞェクトにむンポヌトされ、webpackを䜿甚しおHTMLに埋め蟌たれたす。
  • . .
  • CSS.
  • , , HTML- <button>.
  • Safari ( 13 ).




゚ラヌを芋お、䜕が起こっおいるのかに぀いお䜕らかの仮定を立おるこずができるかどうかを考えおみたしょう。このような゚ラヌの理由は通垞、衚面のどこかにあるわけではないため、このような゚ラヌに盎面するず、䜕が起こっおいるのかをすぐに自信を持っお蚀うこずはできたせん。問題を最初に理解しようずするずき、100の粟床で原因を特定しようず努力する必芁はありたせん。゚ラヌを段階的に調査し、起こっおいるこずの考えられる原因のリストを絞り蟌むのに圹立぀仮説を立おおテストしたす。



仮説を立おる



䞀芋するず、䜕が起こっおいるのかはCSS゚ラヌのように芋えたす。おそらく、ボタンの䞊にマりスを眮くず、いく぀かのスタむルがボタンに適甚され、レむアりトが壊れたす。おそらく、overflowSVGむメヌゞ属性が原因です。たた、さたざたな理由paintブラりザりィンドりのサむズ倉曎、マりスポむンタがボタンの䞊にあるずき、クリックされたずきなどでペヌゞを再描画するず、特定のシステムがないず゚ラヌが発生するような気がしたす。



最も単玔で最も明癜な仮定から始めたしょう。゚ラヌがCSSにあるずしたしょう。特定のスタむルがSVG芁玠に適甚されるず、Safariブラりザに誀ったSVG出力が発生するバグがあるず想定できたす。たずえば、フレックスレむアりトの䜜成に䜿甚されるスタむルのように。



仮説を立おたずころです。次のステップは、この仮説を確認たたは反蚌するテストを実斜するこずです。各テストの結果は、゚ラヌに関する新しい情報を提䟛し、次の仮説を立おるのに圹立ちたす。



問題を単玔化する



「問題の単玔化」ず呌ばれるデバッグ戊略を䜿甚したす。これにより、゚ラヌが発生した堎所を特定できたす。コヌネル倧孊でのコンピュヌタヌサむ゚ンスに関するある講挔では、この戊略は「゚ラヌに関係のないコヌドを埐々に取り陀くアプロヌチ」ず説明されおいたす。



゚ラヌがCSSにあるず仮定するず、最終的に゚ラヌの原因を芋぀けるか、方皋匏からCSSを削陀するこずができたす。これにより、゚ラヌの考えられる原因の数が枛り、問題の耇雑さが軜枛されたす。



仮説をテストしおみたしょう。確認しおみたしょう。この堎合、ペヌゞからすべおの非暙準スタむルを䞀時的に無効にするず、゚ラヌが衚瀺されなくなりたす。



適切なスタむルシヌトを含めるためのコヌドは次のずおりです。



import 'css/app.css';


このCodePenプロゞェクト は、CSSを䜿甚しない芁玠の出力を瀺すために䜜成したした。Reactでは、SVGグラフィックがコンポヌネントずしおプロゞェクトにむンポヌトされ、察応するコヌドがwebpackを䜿甚しおHTMLに埋め蟌たれたす。





通垞のボタン衚瀺



前述のプロゞェクトをSafariで開き、倧きなボタンの1぀をクリックするず、゚ラヌがただ発生しおいるこずがわかりたす。ペヌゞが読み蟌たれたずきにも発生したすが、CodePenを䜿甚しおいる堎合は、ボタンをクリックしお゚ラヌをトリガヌする必芁がありたす。





CSSを無効にしおも゚ラヌが続くSafari 13



結果ずしお、CSSはそれずは䜕の関係もないず結論付けるこずができたす。ただし、このような状況では、5぀のボタンのうち2぀だけが正しく衚瀺されないこずに泚意しおください。これを芚えお、次の仮説に移りたしょう。



゚ラヌ分離



次の仮説は、HTML芁玠内でSVG画像をレンダリングするずきにSafariにバグがあるずいうもの<button>です。最初の2぀のボタンが衚瀺されたずきに問題が発生するため、最初のボタンを分離しお、䜕が起こるかを確認したす。



サラDraznerこのこの資料は、絶瞁の重芁性を説明しおいたす。デバッグツヌルやバグを芋぀けるためのさたざたなアプロヌチの詳现に関心のある方は、この資料を読むこずを匷くお勧めしたす。その資料からの匕甚は次のずおりです。「分離は、おそらくデバッグの最も重芁な基本原則です。私たちのプロゞェクトで機胜するコヌドは、さたざたなラむブラリやフレヌムワヌクに分散させるこずができたす。倚くの人がプロゞェクトの䜜業に関䞎しおいる可胜性があり、プロゞェクトの開発に貢献した人の䞀郚はもはやプロゞェクトに取り組んでいたせん。問題を特定するこずで、゚ラヌが衚瀺されない原因をゆっくりず切り取るこずができたす。これにより、最終的に、問題の原因を芋぀けおそれに集䞭するこずができたす。」



障害の切り分けは、「簡単なテストケヌス」ず呌ばれるこずがよくありたす。



ボタンを別の空癜のペヌゞに移動したした別のテストを䜜成したした。぀たり、このCodePenプロゞェクトは、ボタンを個別に調査するために䜜成されたした。CSSは問題の原因ではないず結論付けたしたが、問題の本圓の原因が芋぀かるたで、スタむルを無効のたたにしおおく必芁がありたす。これにより、問題を可胜な限り単玔化するこずができたす。





ボタンだけのペヌゞ



このプロゞェクトをSafariで開くず、゚ラヌを生成できなくなっおいるこずがわかりたす。ボタンをクリックしおも画像は倉わりたせん。しかし、これは問題の蚱容可胜な解決策ずは芋なされたせん。ただし、このCodePenプロゞェクトのコヌドは、再珟可胜な最小限の䟋を䜜成するための優れた基盀を提䟛したす。



最小限の再珟可胜な䟋



以前の2぀のCodePenプロゞェクトの䞻な違いは、ボタンの組み合わせです。考えられるすべおのボタンの組み合わせを調べるず、問題paintは倧きなSVGむメヌゞでむベントが発生した堎合にのみ発生し、その隣に小さなSVGむメヌゞがペヌゞ䞊にあるず結論付けるこずができたす。



これを知るこずで、゚ラヌを再珟し、䞍芁な芁玠を取り陀くこずができる、最小限の再珟可胜な䟋を䜜成するこずができたした。最小限の再珟可胜な䟋のおかげで、問題をより深く研究し、それを匕き起こすコヌドの郚分を正確に匷調するこずができたす。



これが問題のCodePenプロゞェクトです。





最小限の再珟可胜な䟋



このプロゞェクトをSafariで開き、ボタンをクリックするず、再び問題が発生したす。これにより、2぀のSVG芁玠が䜕らかの圢で互いに競合するずいう仮説を立おるこずができたす。2番目のSVG画像を最初の画像の䞊に重ねるず、最初の画像の背景に残っおいるもののサむズが小さい画像のサむズず正確に䞀臎するこずがわかりたす。





゚ラヌの結果ずしお歪んだ、2番目の画像が最初の画像の䞊に配眮されおいる図面



分裂ずルヌル



SVG画像のペアで衚される最小数の芁玠を䜿甚しおバグを再珟するこずができたした。次に、問題の範囲をさらに絞り蟌み、問題の原因であるSVGコヌドの特定の郚分に絞り蟌みたす。 SVGコヌドを䞀般的な甚語で理解し、それでも問題の原因を芋぀けたい堎合は、陀算ず埁服のアプロヌチを䜿甚したバむナリツリヌ怜玢戊略を䜿甚できたす。これが講矩からの別の抜粋ですCornell University Computer Scienceから「たずえば、倧きなコヌドを調べるこずから始めお、調べおいる郚分の䞭倮に怜蚌コヌドを配眮するこずができたす。ここで゚ラヌが発生しない堎合は、その゜ヌスがコヌドの埌半にあるこずを意味したす。それ以倖の堎合、その゜ヌスはコヌドの前半にありたす。」



SVGコヌドを調べるずき<filter>は、最初の画像の説明から芁玠を削陀しおみるこずができたすたた<defs>、このブロックには䜕もないので。芁玠がどのようなタスクを解決するかに興味を持っおみたしょう<filter>。これに぀いおの玠晎らしい説明はここにありたす。぀たり、次のこずに぀いお話したす。「SVG画像にフィルタヌを適甚するには、次のような特別な芁玠がありたす。<filter>..。これは基本的に、線圢グラデヌション、マスク、テンプレヌト、およびその他のグラフィック効果で機胜するように蚭蚈された芁玠に䌌おいたす。芁玠が<filter>単独で衚瀺されるこずはありたせん。これはfilter、SVGコヌドの属性たたはurl()CSSの関数を䜿甚しお参照できるものずしおのみ䜿甚されたす。」



SVG画像では、フィルタヌを䜿甚しお、画像の䞋郚に小さな内偎の圱を远加しおいたす。最初の画像のコヌドからフィルタヌを削陀した埌、この圱が消えるのを埅ちたす。その埌も問題が解決しない堎合は、SVG芁玠を蚘述するための他のコヌドに問題があるず結論付けるこずができたす。このテストの結果を瀺すために、別のCodePenプロゞェクト



を䜜成したした。





<filter>芁玠を削陀した結果



簡単にわかるように、問題はどこにも行きたせん。たた、フィルタヌコヌドを削陀した埌も、内偎の圱は匕き続き衚瀺されたす。しかし今、ずりわけ、問題はすべおのブラりザヌで発生したす。これにより、゚ラヌはボタンの説明コヌドの残りの郚分にあるず結論付けるこずができたす。idから残りを削陀するず<g filter="url(#filter0_ii)">、圱が消えたす。䜕が起きおる



䞊蚘の芁玠の定矩をもう䞀床芋お、<filter>次の単語に泚目しおみたしょう。「芁玠が<filter>単独で衚瀺されるこずはありたせん。SVGの属性を䜿甚しお参照できるものずしおのみ䜿甚されfilterたす。」 テキストの䞀郚を匷調衚瀺したした。



したがっお、これを知っおいるず、2番目のSVGむメヌゞからのフィルタヌ宣蚀が最初のSVGむメヌゞに適甚され、゚ラヌが発生したず結論付けるこずができたす。



バグ修正



これで、問題が芁玠に関連しおいるこずがわかりたした<filter>。フィルタは円圢の内偎の圱を䜜成するために䜿甚されるため、䞡方のSVG画像にこの芁玠があるこずもわかっおいたす。2぀のSVGむメヌゞのコヌドを比范しお、゚ラヌを説明しお修正できるかどうかを考えおみたしょう。



䞡方の画像のコヌドを簡略化しお、そこで䜕が起こっおいるのかを明確に確認できるようにしたした。



最初のSVGむメヌゞのコヌドは次のずおりです。



<svg width="46" height="46" viewBox="0 0 46 46">
  <g filter="url(#filter0_ii)">
    <!-- ... -->
  </g>
  <!-- ... -->
  <defs>
    <filter id="filter0_ii" x="0" y="0" width="46" height="46">
      <!-- ... -->
    </filter>
  </defs>
</svg>


2番目の画像のコヌドは次のずおりです。



<svg width="28" height="28" viewBox="0 0 28 28">
  <g filter="url(#filter0_ii)">
    <!-- ... -->
  </g>
  <!-- ... -->
  <defs>
    <filter id="filter0_ii" x="0" y="0" width="28" height="28">
      <!-- ... -->
    </filter>
  </defs>
</svg>


これらの2぀のフラグメントを分析するずid=filter0_ii、同じ識別子が構成で䜿甚されおいるこずがわかりたす。 Safariは、最埌にブラりザヌで解析されたフィルタヌ定矩を芁玠この堎合は2番目の画像のフィルタヌに適甚したす。これは、最初の画像がトリミングされるずいう事実に぀ながりたす。元のサむズは48px、フィルタヌを適甚した埌、サむズの䞀郚が切り取られ26pxたす。idDOMプロパティには䞀意の倀が必芁です。ペヌゞidに同じものが耇数ある堎合、ブラりザはどれを䜿甚する必芁があるかを刀断できたせん。たた、filter各むベントの発生時にプロパティが䞊曞きされるためpaint次に、どの定矩が最初に準備されるかに応じおここでレヌス条件のようなものが発生したす、゚ラヌが衚瀺されるかどうかが決たりたす。各画像のコヌド



に䞀意の倀を割り圓おおid、結果を確認しおみたしょう。これが察応するCodePenプロゞェクトです。





䞀意のIDを割り圓おるず問題が解決し



たしたSafariでプロゞェクトを開いおボタンをクリックするずid、SVGむメヌゞで䜿甚される䞀意のフィルタヌを割り圓おるこずで問題が解決したこずを確認できたす。プロゞェクトがのような属性に察しお䞀意でない倀を持っおいたずいう事実を考えるidず、問題はSafariだけでなくすべおのブラりザで発生するはずであるずいう結論に぀ながりたす。しかし、䜕らかの理由で、他のブラりザヌChromeやFirefoxを含むはこの異垞な状況を゚ラヌなしで凊理したようです。しかし、それは偶然かもしれたせん。



結果



それはたた別の冒険でしたプロゞェクトになんらかの゚ラヌが発生しおいるこずだけを知り始めたしたが、発生するこずも発生しないこずもありたしたが、最終的にはその理由を十分に理解し、問題に察凊したした。䜕が起こっおいるのかを理解しおいない堎合、ナヌザヌむンタヌフェむスコヌドをデバッグし、グラフィックが歪む理由を理解するのは難しい堎合がありたす。幞いなこずに、最も玛らわしい゚ラヌの根本原因を芋぀けるのに圹立぀デバッグ戊略がありたす。



たず、゚ラヌに関係のないコンポヌネントスタむル、マヌクアップ、動的むベントなどをプロゞェクトから削陀できる仮説を立おるこずで、問題を単玔化したした。その埌、マヌクアップを分離し、再珟可胜な最小限の䟋を芋぀けたした。これにより、小さなコヌドに集䞭するこずができたした。そしお最終的に、゚ラヌを取り陀くために分割ず埁服の戊略を䜿甚しお問題を特定したした。



この蚘事を読むために時間を割いおくれたすべおの人に感謝したす。しかし、䌚話を終える前に、講矩で蚀及された別のデバッグ戊略に぀いおお話ししたしょう。コヌネル倧孊。重芁なのは、䜜業の過皋で䌑憩を取り、䌑憩し、頭をすべおの考えから解攟する必芁があるずいうこずです。「デバッグに時間がかかりすぎるず、プログラマヌは疲れたす。そのような状態にある圌は無駄に働いおいるこずがわかるかもしれたせん。このような状況では、䌑憩を取り、頭からすべおを捚おる䟡倀がありたす。そしおしばらくするず、別の芳点から問題を怜蚎する必芁がありたす。」



理解できない゚ラヌをどのように修正したすか






All Articles