デバッガでトレースしやすい書き方

IDEのデバッガには、1行づつの「ステップ」、関数の中へ入る「ステップイン」、関数から戻る「ステップオーバー」、ローカル変数やメンバー変数の値を表示する機能があります。式の一部分を指定して評価する機能もありますが、その操作をする必要があります。

「ステップイン」することなく、「ステップ」だけでどこを通っているかを確認できたり、関数の戻り値を確認できると、デバッグしやすいです。

以下の例は、架空の言語です。

1行に関数を2つ以上書くと、2つめ以降の関数にステップインしにくい

デバッグしにくい例
func_b内にステップインするためには、1回目の「ステップイン」でfunc_aにステップインします。「ステップオーバー」でこの行に戻ります。2回目の「ステップイン」でfunc_bにステップインします。

func_a(); func_b();

デバッグしやすい例
func_bの行で止まり「ステップイン」すると、func_b内にステップインします。

func_a();
func_b();

if文の条件部分と本体を1行にすると、ifの本体を通ったのかわからない

デバッグしにくい例
ステップ実行すると、if文のtrue/falseに関係なく、次の行に進みます。funcを呼んだかどうかがわかりづらいです。

if (1 < a) { func(); }

デバッグしやすい例
ステップ実行すると、if文がtrueなら、func()の行で止まります。

if (1 < a) {
    func(x);
}

if文の条件式が複雑だと、デバッグしにくい

デバッグしにくい例

if (x <= func_a() && y <= func_b()) {
}

デバッグしやすい例

function is_xxxx(x, y) {
    a = func_a();
    b = func_b();
    f1 = x <= a;
    f2 = y <= b;
    f = f1 && f2;
    return f;
}

if (is_xxxx(x, y)) {
}

関数Aの引数で関数Bを呼ぶと、関数Bの戻り値を確認しにくい

デバッグしにくい例
func_bの戻り値を確認するには、func_aにステップインする必要があります。
また「1行に関数を2つ以上書くと、2つめ以降の関数にステップインしにくい」と同じ問題があります。

func_a(func_b());

デバッグしやすい例
func_a(b);の行で止まると、変数のbの値が表示されます。

b = func_b();
func_a(b);

return式で関数Aを呼ぶと、関数Aの戻り値を確認しにくい

デバッグしにくい例
funcの戻り値を確認できません。

return func();

デバッグしやすい例
return result;で止まると、変数resultの値が表示されます。

result = func();
return result;

右辺の式内で関数を呼ぶと、戻り値を確認しにくい

デバッグしにくい例
func_aやfunc_bにステップインしないと、戻り値を確認できません。

x = func_a() + func_b();

デバッグしやすい例
x = a + b;の行で止まると、変数aや変数bの値が表示されます。

a = func_a();
b = func_b();
x = a + b;