最近、誰かとstraceについて議論していましたが、彼らはネットワークソケットやそのようなものを作成している間に実行中のプロセスを追跡するとどうなりますか?これにより、プログラムが予期しない方法でクラッシュする可能性がありますか?
ptrace(straceで使用されるシステムコール)について読んだことによると、スレッドをデバッグするだけで同様の状況が発生してはいけません。システムコールが呼び出されるたびにプロセスは停止しますが、後で再起動する必要があり、もはや賢明ではありません。シグナルは実行されていないときにキューに追加されるため、システムコール/ソケット/リスナーでも同様のことが起こるとします。
straceコンテキストでptraceを使用すると、奇妙なプロセスクラッシュが発生しますか?
答え1
いいえ、strace
プログラムの競合を引き起こすべきではありません。 -
とは別にやや珍しい場合:
依存性がある場合実行時間またはランタイムメモリ位置。
この問題が発生する可能性があります」ハイゼンベルク" - しかし、非常にまれです。このバグは非常にまれであるため、straceや他のツールでのみトリガーすることができます。
ptrace()
システムコールに関しては、strace
私が思っていたのと同じで似ています。strace
自分で使うよりも多くのことができますptrace()
。
あなたの例では、エラーは次のとおりです。
この例では、strace
ネットワーク接続を作成するステップのタイミングを変更します。これにより問題が発生した場合、「発生を待つ問題」です。実行時点が変更され続けます。はいstrace
、もう少しすればいいです。ただし、ランチャーなどの他のアプリケーションでは、時間をさらに変更できます。
答え2
Webソケットなどの作成中に実行中のプロセスを追跡するとどうなりますか?
同様の操作が次のように行われます。システムコールは、プロセスがカーネルに要求し、カーネルがそれを満たすことを意味します。カーネルにはptrace()
仕事を動かす魔法もあります。これはそれ自体を越えることができないことを意味するわけではありませんが(バグかもしれません)、マルチタスクシステムでプロセスを調整することは明らかにその目的の1つであるためそうではありません。
答え3
GUIプロセスを追跡すると、最新のオペレーティングシステムでも頻繁にクラッシュが発生することがわかりました(少なくともOpenSuse 12.3、GUIプロセスの追跡をほとんど放棄したため、特に13.1を試していません)。
最近のオペレーティングシステムで競合を引き起こすGUIではなく、プロセスの痕跡を見たことはありません。
答え4
はい。このようなことは珍しく、理由はわかりませんが、確かに発生します。最近、長い間実行されている "swapoff"コマンドを追跡している間にこの問題が発生しましたが、ネットワークにアクセスできないか、問題を引き起こすと思われるものは何もありませんでした。それにもかかわらず、プロセスはstraceを接続した直後に終了しました。
>strace -p 73358
strace: Process 73358 attached
getuid() = 0
geteuid() = 0
getgid() = 0
getegid() = 0
prctl(PR_GET_DUMPABLE) = 1
stat("/etc/fstab", {st_mode=S_IFREG|0644, st_size=2168, ...}) = 0
open("/etc/fstab", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2168, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f24e5cd8000
read(3, "\n#\n# /etc/fstab\n# Created by ana"..., 4096) = 2168
read(3, "", 4096) = 0
close(3) = 0
munmap(0x7f24e5cd8000, 4096) = 0
close(1) = 0
close(2) = 0
exit_group(-1) = ?
+++ exited with 255 +++
プロセスが自動的に終了することが決定されたように見えますが、straceが開始されるまでに数時間実行されたことを考慮すると、この終了が偶然の一致であると思われます。
はい。 straceは時々プロセスを中断する可能性がありますが、良い情報を得ることの利点がリスクよりも大きい場合は非常にまれです。
/proc/<PID>/stack
Linuxのもう1つのオプションは、プロセスが現在ブロックされている場所を確認することです。これにより、より安全ですが、動的でない情報が提供されます。