主な質問:
puts
(ハードコードされた文字列の)ステートメントは、プログラムフローにどのように影響しますか?
後で説明する理由から、コードの不完全な部分に飛び込みます。
proc bgerror { error } {
puts "Background error: $error"
exit 1
}
Tclプログラムを実行すると、次のようになります。
Background error: can't read "YPE(PROCESS)": no such variable
十分に公平だと思いました。$
どこかでかっこをいじくりまわしたに違いありません。問題を見つけるために、私はputs
どこにでもステートメントを置き、プログラムを再実行しました。
しかし、今回は私のプログラムがクラッシュしました:
9526: tclsh testProgram
fffffd7ffeafebba waitid (0, 253d, fffffd7fffdf4950, 3)
fffffd7ffeaeff9d waitpid () + 7d
fffffd7ffe635132 __1cPGetPstackOutput6Fiiipci_v_ () + b2
fffffd7ffe634bfb App_CoreSignalHandler () + 76b
fffffd7ffeafb7b6 __sighndlr () + 6
fffffd7ffeaf0b82 call_user_handler () + 252
fffffd7ffeaf0d68 sigacthandler (b, fffffd7fffdfa500, fffffd7fffdfa1a0) + a8
--- called from signal handler with signal 11 (SIGSEGV) ---
痛い。
最終的に、私は非常に奇妙なことに気づきました。
proc OnNewState { } {
puts "foobar"
# ...
}
ステートメントでputs
、私はクラッシュします。それがないと、元のエラーが発生します。(え?!)私はそれが決定論的であることを確認するために何度も前後にひっくり返しました—そしてそれはそうでした。
さて、私がコードの不完全な部分に飛び込んだ理由は、特定のものではなく、抽象的なものに注意を向けたかったからです。
(完全なコードは複雑で不透明であり、主に私の会社のインフラストラクチャライブラリを利用しているため、とにかく理解できるように単純化することは実用的ではありませんでした。さらに、問題がなくなるため、問題がインフラストラクチャライブラリの1つに起因することはすでにわかっています。 TCPパブリッシャー/サブスクライバースタックライブラリに関連付けられているコードを少し削除したとき。)
puts
(ハードコードされた文字列の)ステートメントは、プログラムフローにどのように影響しますか?
問題のライブラリの基礎となるCソースを掘り下げ始めたとしても、何を探すべきかわかりません。
経験豊富なTcl'ersが光を当てることを期待しています...