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