Repository navigation
v1.5.2.6
【不具合修正 (Fix)】 受信ループにおける、無限ループ問題の、修正
Chromium-Automation-with-CDP-for-VBA
問題の概要:
特定の、稀な条件下において、invokeMethodなどが、内部で実行する、CDPメッセージの受信ループが、無限ループに陥り、VBAがフリーズする、という、深刻な不具合がありました。
原因分析:
この問題は、以下の複数の条件が、同時に、発生した場合に、トリガーされていました。
- イベントキャプチャ機能の、ON/OFFが、切り替わるなど、内部状態が、複雑に、変化する。
- Split後の解析で、 目的の「コマンド応答」 が、到着する。
- 最後の要素が、メッセージの"境界"(
vbNullChar)を、またぐ形で、 データが"欠損" して、受信される。
この結果、次の受信処理を行う際、欠損データを蓄積するバッファが、 [欠損データ][コマンド結果] という、1つの文字列に、 欠けたJsonと完全なJson といった感じでくっついてしまい、「コマンド結果はまだ来てない」と、誤判断し、ループが、抜けられなくなっていました。
修正内容:
この 「競合状態(Race Condition)」 に、起因する、無限ループを、根本的に、解決するため、受信ループの 終了判定ロジック を、強化しました。
- 「欠損データフラグ」の、導入:
- 受信データを
Splitした結果、最後の要素が、空文字でない場合(=データが、vbNullCharで、終わっていない)、これを 「欠損データあり」 と、判定する、内部フラグを、新設しました。
- 受信データを
- ループ終了条件の、厳格化:
- 受信ループが、終了する条件を、
「目的の、コマンド応答を、受信した」
"かつ"
「欠損データフラグが、立っていない」 - という、AND条件に、変更しました。
- 受信ループが、終了する条件を、
この修正により、たとえ、コマンド応答と、データの欠損が、同時に発生しても、ループは、次のデータが、到着し、メッセージが"完全な"形になるまで、安全に、待機を続けます。
これにより、ライブラリの、非同期処理における、安定性と信頼性が、大幅に、向上しました。