上記に紹介した通り、デバッガは非常に有用ですが、以下のように、デバッガ使用時に特有のトリッキーなバグが発生する可能性があります。
成果物にもよりますが、ビルド構成を切り替えるとバグが再現しない場合があります。例えば、デバッグビルドで一通り作成し、リリースビルドでテストすると、意図した動作となりません。事象を再確認するために、デバッグビルドに変更すると、事象が再現されなくなります。理由の一つが最適化で、デバッグビルドとリリースビルドのメモリ配置が異なっていることが原因かもしれません。
エンジニアにもよるでしょうが、デバッグ時にはデバッグ特有の処理を記述することがあります。例えば、ifdefなどを使用してデバッグビルドとリリースビルドの使い分けをします。その際、「デバッグ用の処理がなくなることによるタイミングのずれ」や「どちらかの差分にバグを作りこんだ」ことにより、意図した動作をしない可能性があります。
デバッガは、プログラムを一時停止しながら実行するので、「処理時間がオーバーしてプログラムが停止する」などのバグを見つけることは非常に困難です。ロジックが正しくないと思ってデバッガでチェックしても見つかりません。周波数100Hzの処理なのに1秒間に10回ではなく、8回しか実行しないなど、処理時間関係のバグは別の深い箇所に原因があります。
バグの兆候は、ビルド構成を変更すると、意図した動作とならない場合です。その場合は、デバッグビルドとリリースビルドにログや標準出力などの目に見える差分がないか確認しましょう。その後、最初に取り上げたデバッグ作業(標準出力、ログ、コメントアウト)を活用しバグの場所を絞り込みましょう。
このバグの有効な対策はあまりありませんが、成果物のバグ発生が収束してきたら、リリースビルドを使用して回帰テストを実施しましょう。くれぐれも、リリース直前までデバッグビルドで確認し続けないことが重要です。
思い通りのプログラムを作ることは簡単ではありません。今回は、デバッガの使い方とビルド構成に関連するバグを紹介しました。もし、プログラムの動作に悩んでいる新人を見かけたら、デバッガの具体的な使用方法を教えるといいでしょう。
また、ビルド構成の違いでバグが発生すると、原因が分からず悩みます。デバッグビルドで正常動作を確認しても、安心できません。リリースビルドで再確認し、ビルド構成が変わっても問題ないか確認しておきましょう。
山浦恒央先生が執筆した書籍「ソフトウェア技術者のためのバグ検出ドリル」が日科技連出版から発売中です。本連載「山浦恒央の“くみこみ”な話」とTechFactoryの連載「組み込みエンジニアの現場力養成演習ドリル」をベースに、大幅加筆、改訂した内容になっています。
内容は、「デバッグの詰将棋」で、要求仕様定義、設計、コーディング、テスト、保守の5フェーズでの「バグを埋め込んだ仕様記述やソースコード」を読んで、バグをピンポイントで見つける問題集になっています。全部で31問あり、難易度は初級から上級まで、いろいろです。興味のある方は、Amazon.comや書店でチェックしてください!
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.