ソフトウェア技術者のためのバグ百科事典(10)デバッグの強力な手掛かり「ログ」のバグ:山浦恒央の“くみこみ”な話(131)(2/3 ページ)
ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」。第10回は、デバッグの強力な手掛かりとなる「ログ」にまつわるバグを取り上げます。
4.よくあるログのバグ
表1のログ一覧表を題材として、筆者が取り上げるログのバグを説明します。
ログ項目 | 型 | 変数名 |
---|---|---|
加速度X | float | accelerationX |
加速度Y | float | accelerationY |
加速度Z | float | accelerationZ |
角加速度X | double | angular_accelerationX |
角加速度Y | double | angular_accelerationY |
角加速度Z | double | angular_accelerationZ |
表1 ログ一覧表(ログを行う変数名をまとめた一覧表) |
4.1 取得したいログが取れていない
ログを入れたのに、意図したログを取得できないことがあります。
4.1.1 変数名の記述ミス
ログのバグでよくあるのが、変数名を間違えて記述してしまうことです。例えば、下記の記述です。
fprintf(*fp, "%f",acclerationX); //角加速度Xをファイルに出力
リスト1は角加速度X(angular_accelerationX)をファイルに出力するつもりなのですが、加速度X(accelerationX)が出てしまいます。開発者本人は、角加速度のログと思っていますので、かなり悩むことになります。
4.1.2 ログを入れる場所を間違える
当たり前ですが、ログの入れる場所を誤ると正しくログが取得できません。その場合、バグの事象を把握できず、謎は深まるばかりです。
if ( a == b ) { fprintf("*fp, "%f", angular_accelerationX); fprintf("*fp, "%f", angular_accelerationY); fprintf("*fp, "%f", angular_accelerationZ); } else { //実はelse句に入れないといけなかった }
リスト2には、ログの場所を入れ間違えたプログラムの例を示しました。例えば、aとbが一致しない場合に発生するバグがあり、現在、数日に1回発生するとします。発生頻度が低いバグは、見つけるのがものすごく大変です。もちろん、バグの原因が分かるまではどこにバグがあるかも分かりませんので、あらゆる箇所にログを埋めるのですが、ログの埋め込み場所を間違えると、ログを見てもバグの手掛かりになりません。また、プログラムが大きくなると、適切な場所にログを仕掛けることが難しくなります。結果、バグの手掛かりを取得できなくなります。
4.1.3 一覧表が間違っている
扱うソフトウェアによっては、大量のログを作成する必要があります。項目が多いことはよいのですが、そもそもの一覧表を間違えて作成してしまうことがあります。
ログ項目 | 型 | 変数名 |
---|---|---|
加速度Z | float | accelerationZ |
角加速度X | double | angular_accelerationX |
表2 ログ一覧表(抜粋) |
表2は、表1のログ一覧表から一部を抜粋したものです。もしかしたら、「float型の加速度Z」がfloat型ではなく、double型かもしれません。注意して作成する必要があるでしょう。
4.2 ログファイルの容量が大きすぎる
作成するプログラムによっては、大量のログを毎回作成することがあります。その場合、ログの出力の方法を工夫しないと、ログが大容量となり、ファイルを開けない可能性があります。例えば、Excelの場合は、数100MBもデータがあると、重くなり、それ以上になるとファイルを開くのが困難になります。航空機のフライトレコーダーから得られる記録データのように、ラウンドアップして、直近のデータを採集する仕組みを作りましょう。
4.3 外部記憶装置を圧迫する
ログが増えてくると、HDDなどの外部記憶装置の容量を圧迫し、意図しない問題が発生することがあります。最近の外部記憶装置は容量が大きいため、ほとんど発生しないでしょうが、記憶装置の容量は有限だということを覚えておきましょう。
4.4 ログによる機能退行
バグの調査のためにログを仕込むことがあります。たいていはうまくいくのですが、たまに、仕込んだログが原因で発生するバグもあります。例えば、プログラムの記述ミスや、ログの処理が増えたことによるハードウェアリソースの圧迫などです。この事象は、事象をさらに複雑にするものですから、注意したいところです。
4.5 ログを外すと動かない
ログを出力しながらデバッグし、全機能が正常に動作したので、ログを出力しないようにすると、予想外のバグが出たりします。特に、タイミング系のバグがログによってマスクされる場合です。外部出力にログを出すのは、場合によってはミリ秒の時間がかかり、その間に、いろいろなプロセスの処理の同期が取れ、遅いプロセスが追い付き、たまたまうまく動作することがあります。
正常に動作している場合で、処理速度の問題がなければ、ログは残しておきましょう。製品として、ログを出せない場合や、処理速度を上げるためログを外す場合、細心の注意を払わねばなりません。回帰テストを全件、実施すべきです。
Copyright © ITmedia, Inc. All Rights Reserved.