デバッグの微妙さまたはデバッグで半日殺す方法(しない)

昨日、PHPコードで例外の理由を解明しようとして半日費やしましたが、午前中に理由は自分自身であることがわかりました。 むしろ、PhpStorm IDEでデバッガを使用してコードの進行状況を追跡します。







画像







状況の条件-カットの下。







開始するには、エラーメッセージは次のとおりです。







Warning: Magento\Ui\TemplateEngine\Xhtml\Result::__toString(): Not yet implemented in /.../Xhtml/Result.php on line 97
      
      





次に、メッセージに記載されているコード番号97の行:







 if ('noNamespaceSchemaLocation' === $name)
      
      





すべてが透明であるかのように-比較するときに$name



文字列に変換されると、例外が発生します(この場合のスタックトレースでは、 $name



__toString()



メソッドである$name



考えが少し後に思い浮かびます)。







メソッド自体は次のとおりです。







 public function __toString() { try { $templateRootElement = $this->getDocumentElement(); foreach ($templateRootElement->attributes as $name => $attribute) { if ('noNamespaceSchemaLocation' === $name) { $this->getDocumentElement()->removeAttributeNode($attribute); break; } } $templateRootElement->removeAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'xsi'); $this->compiler->compile($templateRootElement, $this->component, $this->component); $this->appendLayoutConfiguration(); $result = $this->compiler->postprocessing($this->template->__toString()); } catch (\Exception $e) { $this->logger->critical($e->getMessage()); $result = $e->getMessage(); } return $result; }
      
      





すでに幾分カーリーがあります-例外をキャッチするtry ... catchブロックがあります。 しかし、犯罪もありません:動作するすべて-コンパイラによって文字列になります( $result = $this->compiler->postprocessing(...)



)、動作しません-エラーメッセージになります( $result = $e->getMessage()



)。







私は、このコードのデバッガーの下でif ('noNamespaceSchemaLocation' === $name)



$this->logger->critical($e->getMessage())



、例外をキャッチし、 $this->logger->critical($e->getMessage())



、その後、 \Magento\Backend\Model\Session\Interceptor::writeClose



への不可解なジャンプ\Magento\Backend\Model\Session\Interceptor::writeClose



、その後アプリケーションが中断されます。







それだけです すべてが水で終わる-実行スレッドが終了し、ブラウザの「HTTP ERROR 500」で、サーバーログにResult::__toString(): Not yet implemented









そして、デバッガーで__toString()



メソッドを入力するだけで、アプリケーションはそのような奇妙な方法で終了します。 ステップオーバーをスキップすると、コードのこのセクションは正しく機能します。 また、デバッガなしで実行しているときにクラッシュしません。







PhpStorm 2017.1.3の環境でデバッグを実行しました。 IDEには、アプリケーションの操作に関する多くの有用な情報(スタックトレース、ウォーキング変数、ウォッチャー)が表示されます。







画像







そして、もちろん、動作中のアプリケーションと対話します。







この場合、集会が行われる理由はわかりませんでした。 私はまだIDEやインタープリターの開発者ではなく、Web開発者です。







私たちの概念が弱いからではなく、多くのものが理解できない。しかし、これらのものは私たちの概念の輪に含まれていないからだ。 」コズマ・プルトコフ







エラーの原因を見つけるための試みでは、コード実行の過程に対するIDEの影響を完全に無視しました。その結果、半日、ぐるぐる回っていました。







PS

これは、上記のケースが現在明らかであり、ハブではなく別の「インターネット」での経験を共有しているすべての人のためのものです。







PPS

記事を書いている間、デバッガーの下のアプリケーションは、期待どおりに動作し始めました。 これがどの時点で発生したのかは明確ではありません(昨日は稼働中のマシンがあり、今日はラップトップであり、その上で状況を再現しました)。 しかし、これは記事自体の本質を変えるものではありません-「 デバッグするとき、特にアプリケーションの動作が不可解になる場合は、IDEがアプリケーションに与える影響を考慮してください 。」








All Articles