最近、私は誰かとstraceについて話し合っていました。彼らは、ネットワークソケットなどを作成しているのと同じように、実行中のプロセスをstraceした場合にどうなるかを尋ねていました。これにより、プログラムが予期しない方法でクラッシュする可能性がありますか?
straceで使用されるsyscallであるptraceについて私が読んだことから、スレッドをデバッグしているだけでは、そのようなことは起こらないはずです。システムコールが呼び出されるたびにプロセスは停止しますが、後で再開する必要があり、賢明ではありません。シグナルは実行されていないときにキューに入れられるので、syscalls / sockets/listenでも同様のことが起こると思います。
straceのコンテキストで使用されるptraceは、奇妙なプロセスクラッシュを引き起こす可能性がありますか?
承認された回答:
いいえ 、strace
プログラムのクラッシュを引き起こしてはなりません–
除く このやや珍しいケースの場合:
実行のタイミングに依存するバグがある場合 、またはランタイムメモリの場所 。
この種の「特異なバグ」を引き起こす可能性があります 」–しかし、非常にまれです。この種のバグはまれであり、straceまたは他のインストルメンテーションの下でのみトリガーする必要があるためです。
そして、特異なバグを見つけた場合、それはしばしば良いことです。
ptrace()
について – syscall –それがstrace
内部で行うと思うので、似ています。 strace
以上のことができます ptrace()
を使用するときにできます 直接。
あなたの例はまさにこの種のバグです:
この例では、strace
ネットワーク接続を作成する手順のタイミングを変更します。それが問題になる場合、それは「発生するのを待っている問題」でした–実行のタイミングは絶えず変化します。 strace
を使用 、 あともうちょい。ただし、プログラムの開始など、他のアプリケーションではタイミングがさらに変更されている可能性があります。