私は一度インタビューの中で次の質問を聞かれました。私はもっと知ることができる人が誰か知っていたのだろうかと疑問に思っていましたが、グーグルが大いに助けてくれていません。ログ文がプログラムの出力を変更するのはなぜですか?
あなたがテストしたいプログラムがあるとします。単一のログステートメントを追加し、突然、期待される出力を生成していたプログラムが期待される出力を生成しなくなります。何が起こったのだろうか?
私は一度インタビューの中で次の質問を聞かれました。私はもっと知ることができる人が誰か知っていたのだろうかと疑問に思っていましたが、グーグルが大いに助けてくれていません。ログ文がプログラムの出力を変更するのはなぜですか?
あなたがテストしたいプログラムがあるとします。単一のログステートメントを追加し、突然、期待される出力を生成していたプログラムが期待される出力を生成しなくなります。何が起こったのだろうか?
Aha。私は実際にこれが起こった。
スタックを破壊しているバグがあるプログラムを考えてみましょう。ログまたはプリントステートメントを導入すると、ログの呼び出しによってスタックが移動し、動作が変わる可能性があります。
例を表示する方法を考えるのは面白い問題です。おそらく、printfの中の悪いフォーマットでそれを行うのが最も簡単です...
大体、少なくとも一例がこのように見えます。
int parent(){ ... printf("%s\n", itoa(child()));
int child(){
int num;
scanf("%d%d", num); /* notice the format; scanf is going to eat more of the
* stack than it should.
*/
return num; /* but this return may unwind the stack successfully. */
}
返品の直前にprintf()
を挿入するとケースが発生します。
"スタックを混ぜる"?明は動詞ではなく、そうであれば、中国の明代と何が関係しているのか分からない。 –
+1:私もこれを見ましたが、デバッグするのは恐ろしいことです! –
@Colin Mingingは醜いために英国のスラングですので、私はこれをuglifyingとして読む:-) –
プログラムには同時スレッド間の競合状態がある可能性があります。したがって、タイミングの変更によってプログラムの動作が変更される可能性があります。あなたのプログラムが誤動作して、あなたは、ログ出力を追加することによって、それをデバッグしたい:
は、通常、これは(いわゆる特異なバグ)はるかに悪いです他の方法でラウンドです。しかしログの出力は問題を遠ざけるので、診断するのは非常に難しくなります。
'print("カウンタは "+ i ++"にあります)\\ lol lol lol' – thecoshman