denshikobo’s blog

PICプログラミングやPCの操作で感じた日々の由無し事を綴ります

デバッグの新しい技を習得した

(2015.10.29)
描画パラメータを計算するルーチンにデバッグ・ダンプ文を挿入したところ、何故か複数回呼び出されることが判りました。オシロジのJAVAプログラムは(何度も手直しを重ねたため)些か見通しが悪くなっていて、どこから呼び出しているのかはっきりしません。

Error Exceptionが発生したときに表示されるコール・スタックを指定した箇所で表示できれば、関数の呼び出し階層を確認することができます。

先達の知恵を借りるべく、ググってみると・・・
ビンゴ~

同じようなことを考えた人が見つかりました。

stackoverflow.com

いくつか回答が寄せられていましたが、その中の一つを使って見ることにしました。
new Exception("Stack trace").printStackTrace();

update_data_positionルーチンに挿入した結果がこれ(適当に編集した)です。
java.lang.Exception: Stack trace
    at Main_Frame.update_data_position(Main_Frame.java:4293)
    at Main_Frame.Display_PositionStateChanged(Main_Frame.java:4301)
    at Main_Frame.access$2600(Main_Frame.java:16)
    at Main_Frame$27.stateChanged(Main_Frame.java:624)
    at javax.swing.JSlider.fireStateChanged(JSlider.java:432)
    at javax.swing.JSlider$ModelListener.stateChanged(JSlider.java:350)
    at javax.swing.RangeModel.fireStateChanged(RangeModel.java:364)
    at javax.swing.RangeModel.setRangeProperties(RangeModel.java:302)
    at javax.swing.RangeModel.setMaximum(DefaultBoundedRangeModel.java:219)
    at javax.swing.JSlider.setMaximum(JSlider.java:619)
    at Main_Frame.update_slider(Main_Frame.java:3920)
    at Main_Frame.window_type_change(Main_Frame.java:3957)
    at Main_Frame.window_button_common(Main_Frame.java:3728)
    at Main_Frame.Window_1_ButtonActionPerformed(Main_Frame.java:3748)
(この下にjava.awt.EventDispatchThread関連の呼び出しが40行くらい続いている)

draw_right_posi:644>draw_max_posi:0
java.lang.Exception: Stack trace
    at Main_Frame.update_data_position(Main_Frame.java:4293)
    at Main_Frame.Display_PositionStateChanged(Main_Frame.java:4301)
    at Main_Frame.access$2600(Main_Frame.java:16)
    at Main_Frame$27.stateChanged(Main_Frame.java:624)
    at javax.swing.JSlider.fireStateChanged(JSlider.java:432)
    at javax.swing.JSlider$ModelListener.stateChanged(JSlider.java:350)
    at javax.swing.RangeModel.fireStateChanged(RangeModel.java:364)
    at javax.swing.RangeModel.setRangeProperties(RangeModel.java:302)
    at javax.swing.RangeModel.setMinimum(RangeModel.java:203)
    at javax.swing.JSlider.setMinimum(JSlider.java:578)
    at Main_Frame.update_slider(Main_Frame.java:3921)
    at Main_Frame.window_type_change(Main_Frame.java:3957)
    at Main_Frame.window_button_common(Main_Frame.java:3728)
    at Main_Frame.Window_1_ButtonActionPerformed(Main_Frame.java:3748)

draw_right_posi:644>draw_max_posi:0
java.lang.Exception: Stack trace
    at Main_Frame.update_data_position(Main_Frame.java:4293)
    at Main_Frame.window_button_common(Main_Frame.java:3729)
    at Main_Frame.Window_1_ButtonActionPerformed(Main_Frame.java:3748)

表示位置を操作するスライダのMin、Maxを設定したときにStateChanged関数が呼び出され、update_data_positionルーチンが呼び出されていることが判りました。

新たなフラグを設けて、StateChanged関数からの呼び出しを制御することにすれば良さそうです。

このデバッグ技は使えます!