5

タイトルはそれを最もよく表しています。Linux では、 and おそらくorで簡単に実行できます。また、OSX Leopard から が削除されるまで、OSX では簡単でした。また、基盤となるシステム コール (afaik) も同様です。stracelsof/proctruss

明らかなアプローチは でこの問題に取り組むことですが、悲しいことにdtrace、イベントが発生したときにイベントをキャッチするため、私が理解している限りでdtraceはうまくいきません。私の場合、ブロッキングシステムコールはすでに開始されています。ちなみに、これが解決できる場合は、修正したいと思いますdtrace

XcodeのInstrumentsには、プロセスのスタックの定期的なサンプルを取得することで同様のことを実現するモニターがあることがわかりました(それを行うためにどのシステムコールが依存しているかはわかりません!)、おそらくコマンドラインで同様のもので十分です(システム コールをラップするライブラリ コールまでのスタックを表示します)。私のユースケースに役立つように、この「サンプリングコマンドラインツール」は、スタック上で見つかった引数を見つけて解析し、ブロックされているファイル/ファイル記述子を特定するのに役立つ必要があります。

最後にもう 1 つ - Linux では、通常、通常のユーザーとしてこれを行うことができます (ptrace_scopeトリックがない場合)。OSX ソリューションが root を必要としないのも素晴らしいことです。

4

2 に答える 2

5

あなたが使用することができますsamplesample PID -e

たとえば、nc -l localhost 5999コールグラフを含むファイルを取得します。

Call graph:
    9046 Thread_242504   DispatchQueue_1: com.apple.main-thread  (serial)
      9046 start  (in libdyld.dylib) + 1  [0x7fff90a847e1]
        9046 ???  (in nc)  load address 0x102453000 + 0x166c  [0x10245466c]
          9046 __accept  (in libsystem_kernel.dylib) + 10  [0x7fff94445996]

そして、ロードされたバイナリイメージのような他の有用な情報。

于 2012-10-28T14:46:26.600 に答える
2

次のことを前提としたソリューションを提案しています。

  1. プロセスにシグナルを送ることができます。
  2. プロセスはシングル スレッドです (ブロッキング スレッドではシグナルが処理されない場合があります)。
  3. あなたはルートアクセス権を持っています。

dtrussは、すべてのシステム コール ( -s 引数) の完全なスタック トレースの出力をサポートしています。

例:

ターミナル1:

$ python
>>> import socket
>>> s = socket.socket()
>>> s.bind(('', 1234))
>>> s.listen(1)
>>> s.accept() # blocking!

ターミナル2:

$ dtruss -s -p `pgrep python` # or your python pid if you don't have pgrep (port install proctools)

ターミナル1:

press Ctrl-C

ターミナル2:

sigreturn(0x7FFF5FBFD660, 0x1E, 0x10031B3D0)             = 0 Err#-2
          libsystem_kernel.dylib`__accept+0xa # HERE IT IS!
          libpython2.7.dylib`PyEval_EvalFrameEx+0x42bf
          libpython2.7.dylib`fast_function+0xb3
...

sigreturn の場合はスタック内の最初のフレーム (シグナル ハンドラのティアダウン コード: http://linux.die.net/man/2/sigreturn )。

2 番目のフレームは、システム コール accept の標準ライブラリ ラッパーです。

于 2012-10-26T21:07:48.200 に答える