デバッグと不確定性原理

客観的事実など存在しない。
あるのは自分の目を通して見た事実だけである
ハイゼンベルク

プログラムの動作がおかしい。そこで、デバッグのためにログ出力のコードを仕込んで動作させてみる。すると、さっきまで調子の悪かったプログラムが正常に動いている。プログラムをもとに戻すとやっぱり動作がおかしい。

このような経験はないでしょうか。いわゆる、デバッグにおける「不確定性原理」の一例です。

不確定性原理とは何か

ハイゼンベルクの不確定性原理(uncertainty principle)とは量子力学における基本原理ですが、これはデバッグに当てはまります。オリジナルの不確定性原理の概要をWikipediaの説明から引用しておきます。
極微の世界では粒子の運動量と位置を同時に決定することはできないという原理。位置をより正確に観測する為にはより正確に「見る」必要があるが、極微の世界でより正確に見る為には、波長の短い光が必要であり、波長の短い光はエネルギーが大きいので観測対象へ与える影響が大きくなる為、観測対象の運動量へ影響を与えてしまうからである。位置を正確に測ろうとするほど、対象の運動量が正確に測れなくなり、運動量を正確に測ろうとすれば逆に位置があいまいになってしまい、両者を完全に正確に測る事は絶対に出来ない。
冒頭のデバッグの例は、まさにこのような不確定性原理がデバッグに適用されたような形になっています。つまり、ログ出力というプログラミングに対する観測行為が、プログラムの動作に影響を与えてしまったために、もともとの状態が変化してしまっていたのです。バグが再現しなくなったのは、観測行為がプログラムの動作を変えてしまっていたのです。

では、なぜログ出力がプログラムの動作を変えてしまったのでしょうか?ログ出力を追加しただけで、アルゴリズムを変えたわけではありません。このような場合で最も多いのは、もともとのバグがタイミングに依存したものであった場合です。マルチスレッドや割り込み処理を行うようなプログラムの場合、ログ出力の追加による僅かなタイミングのずれが、バグを起こらなくしてしまうということは良くある話です。特に、ログの出力先がファイルやシリアル等の場合は、そのタイミングで実行タスクがI/O待ちでスリープしてしまうことがあるためよく起こります。
その他、コードの追加はメモリマップを変更してしまうため、メモリ破壊や変数の初期化漏れ等のバグの挙動を変えてしまうこともあります。

なお、ログ出力等のコード追加をしなくとも、デバッグのためにコンパイルの最適化レベルを変更したり、デバッガをつないだりするだけでもプログラムの挙動に影響を与えてしまうことがありますし、デバッガでブレークをかけたりする行為もプログラムの挙動に影響を与えてしまいます。

不確定性原理とうまく付き合う

では、この不確定性原理の影響を排除するには、どのようにすれば良いのでしょうか。残念ながら、これは「原理」であるので、完全に回避することは不可能です。しかし、何も悲観的になる必要はありません。見方を変えれば、これはデバッグのための観測についての指針を示してくれているものと考えられます。

オリジナルの不確定性原理の説明を再び引用すると、
位置を正確に測ろうとするほど、対象の運動量が正確に測れなくなり、運動量を正確に測ろうとすれば逆に位置があいまいになってしまい、両者を完全に正確に測る事は絶対に出来ない。
とあります。
デバッグに置き換えれば、正確な内部情報を知ろうとすればするほど、もとの動作に影響を与えてしまうということになるでしょうか。
ここで、見方を変えれば、
  • 動作に影響を与えないようにデバッグするためには、
    極力観測による影響が少なくなるようにすれば良い
と考えられます。

具体的な例をあげると、
  • ロギングを使用する場合、目的のログだけを出力する等、対象を絞れる仕組みを入れる
  • ログ出力のI/O負荷が問題になりそうな場合は、ログを絞ってメモリ上に残す
  • ブレークによる一時停止が影響しそうな場合は、条件ブレークを活用して最小限にブレークがかかるようにする。
    もしくは、ロギングを活用したデバッグを行う
等が考えられます。

不確定性原理によるリスク

冒頭の例でもそうですが、デバッグ用のコードの追加がバグを隠してしまうことがあります。このため、開発の終盤にはじめてデバッグ用のコードを抜いたり、最適化レベルを変更したりすると、とたんにプログラムが動かなくなる可能性があります。このような事を防ぐために、普段からデバッグコードを抜いたり、最適化レベルを変えても正常に動くかどうかをチェックしながら開発を進めることが必要です。

4873115930 【関連リンク】
不確定性原理 (Wikipedia)

【関連書籍】
デバッグルール 9つの原則、54のヒント
不確定性原理―運命への挑戦 (都筑 卓司)



このエントリーをはてなブックマークに追加

コメントの投稿

非公開コメント

人気エントリ
最近の記事
本のおすすめ

4274065979

4844337858

482228493X

4904807057

4873114799


最近のコメント
Links
プロフィール
  • Author:proger
  • 組み込み関係で仕事してます
ブログ内検索