デバッガでは見つけにくいバグの発見に威力を発揮します

CodeRecorder(コードレコーダー)は、プログラムの見える化でバグを発見しソース・デバッグまで行えるツールです

見える化するだけでバグが分かる!?

プログラムの見える化ってこと自体が
良く分かりませんが、
それで本当にバグが分かるんですか?

例えば「関数Aの実行時間はこのくらいで、そのあと関数Bが呼ばれて…」というように、頭の中でプログラムの動きをイメージされていると思います。

while (cnt > 0) {
  if (*ptw == 0xfc) {
    func_A();
    func_B();
        :

しかし、実際には「関数A」が思ったより時間がかかっていたり、「関数B」が呼ばれる前に、割り込みが入っていたらどうでしょう?
実際のプログラムの動きは、頭の中に描いているイメージと微妙にズレていることがあり、そこに「バグ」が潜んでいるかもしれません。

なるほど、理屈は分かりましたが、

そもそも見える化ってどんなものですか?

では、小さなプログラムを例に説明します。こんなプログラムがあるとします。

void main_loop() {
  func1();
  func2();
}

void func1() {
  func3();
}

void func2() {
  func4();
}
void func3() {
  func5();
}

void func4() {
  return;
}

void func5() {
  return;
}

例えばこの程度のプログラムでも、パッと構造を理解するのは面倒ですよね。
でも、CodeRecorderで見える化すると…

関数スタック

このように、関数の呼び出し構造と、実行時間を直感的に見える化できます。

関数のコールスタックのイメージが、時系列に表示されるのですね。

でも、これが本当に役に立つのか実例を見せてもらえますか。

実践!見える化でバグを見つける

Step 01とりあえず見える化する!

実際のプログラムを見える化してみると、このような表示になりました。
ところどころ間隔が広い謎の箇所があります。

関数スタック

これはこの関数に時間がかかっていることを示しています。
とりあえず見える化するだけで、このような違和感を発見することができます。

Step 02気になるところを拡大!

異常な部分を拡大ズームしてみるとsend_sio関数であることが判明しました。

 

この関数は、正常な場合「30ms」で実行されますが、異常な場合「500ms」もかかっています。(表示をマウスでクリックすれば関数の実行時間が表示されます。)

関数スタック

今回の場合、大きな問題とはならないのですが、パフォーマンスに影響することが懸念されます。

Step 03ソース・レベルで追跡!

send_sio関数が遅い理由を「ここからデバッグ」機能を使って調べてみます。

この機能は実行記録のデータを使って、再現デバッグを可能にします。

グラフの異常ポイントを右クリックし、「ここからデバッグ」メニューで、Cソースの逆ステップ実行や変数値を再現し、繰り返しデバッグができます。

関数スタック

逆方向にソースをトレース(トレース・バック)して行くと、500msかかるケースではデータが読み出し可能になるまでの待ち時間が長いことが判明しました。

Step 04プログラムを見える化して

  • 全体の構造や問題ポイントを把握可能
  • そこからソース・レベルでの追跡

今までにない新しい形のデバッグが可能です

この例のように一見正常に動作していても、普通のデバッガでは気づかない問題はたくさんあります。こういった問題を解決するために、プログラムの見える化は有効な手段です。

確かにこういったバグをデバッガで見つけるのは難しいですね。

ステップ実行で追いかけていては一生、発見することはできませんね。

関数を見える化するだけで
さまざまな効果が得られます

  • 想定外の関数が呼び出されてバグとなっていました
  • 不要な割り込みが入っていたのが見つかりました
  • 周期割り込みが呼ばれないタイミングが発見できました
  • 思っていたより時間がかかっている関数が見つかりました
  • 不要なタスクが起動していて全体の速度を落としていました
  • 同期処理のミスでタスクが起動していないことが分かりました

なるほど、「見える化の効果」

地味にあなどれないですね。

他にもある便利なデバッグ機能

  • 変数の値をグラフ表示
  • 変数の値をソース追跡と連動して表示
  • 記録データからソース・レベルのデバッグが可能
     トレース、ステップ、ステップ・アウト、カム実行
     すべて逆方向への実行が可能
  • タスクやスレッドを意識したソース追跡
  • µITRON他RTOSのシステムコール認識デバッグ
  • 動的メモリを監視しグラフ表示
  • 動的メモリのリーク表示、多重解放などのエラー表示
  • 実行された関数の検索

まだまだあるCodeRecorderの機能

CodeRecorderは、品質アップやパフォーマンス改善も得意です。

詳しくは、下記ボタンより製品紹介ページをご覧ください。

CodeRecorderはデバッグだけではない、

ということが言いたいんですね。