0

主な質問:

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が光を当てることを期待しています...

4

1 に答える 1

3

まず第一に、あなたが提供する証拠は、あなたがSIGSEGVハンドラーとのコンテキストにあり、それがカスタムコードによって設定されたことを示しています(TclはSIGSEGVハンドラーを設定しません)。

Tclのputsコマンドは、エラーを生成することによってのみ制御フローに影響を与えます。これは、間違った数の引数、無効な引数を渡した場合、またはI / Oレイヤーで問題が発生した場合(stdoutチャネルを閉じた場合など)に影響します。単純puts "foobar"な呼び出しは間違いなく有効な呼び出しであるため、問題はチャネル層から発生しています。または、非標準がputsあります; カスタムコードが標準バージョンに置き換わった場合、発生する可能性のあることはほとんどありません。

では、何が起こっているのでしょうか?さて、この段階での私の最初の疑いは、プログラムの他の場所でメモリが破損していること、そしてこれがどういうわけかstdoutチャネルの内部に影響を与えていることです。私が正しければ、これを追跡するのは非常に難しいでしょう。非ローカルクラッシュは常にハントするのが難しいです。そのシグナルハンドラーをオフにしgdb、クラッシュが実際に発生した場所を確認できるようにアタッチvalgrindし、メモリが正しく処理されるようにするために使用することをお勧めします(運が良ければvalgrind、問題がどこにあるかを示すことができます)まっすぐに)。

于 2012-09-29T08:07:59.983 に答える