2

Linuxx64プロセスでHeisenbugを追いかけています。(デバッガーまたはstraceを使用してプロセスにアタッチすると、問題が発生することはありません。)コードが障害を検出し、その方法でgdbをアタッチすると、無限ループに入ることができましたが、ファイルが表示されるだけです。動作しているはずの記述子(fd)は無効になりました。私は本当にfdの履歴を取得したいので、straceを試しますが、もちろんそれでは問題のレポはできません。

他の要因は、gdb/straceの問題がタイミングであることを示しています。straceを実行して、 -etrace=descまたは-eraw=openramdiskに出力して、問題をトリガーする正しい方法でstraceのオーバーヘッドを削減できるかどうかを確認しましたが、成功しませんでした。strace +を実行してみましたが、straceよりも桁違いに遅くなっています。

私が接続しているプロセスは、一部はソースアクセス権のない商用バイナリであり、一部はプロセススペースにプリロードするコードであるため、printfどこでも100%可能というわけではありません。

fdの履歴を追跡する方法についての提案はありますか?

更新: strace+に関するメモを追加

4

1 に答える 1

1

私は次の方法でトレースの問題を解決しました。

  1. 関連するシステムコール、、、およびの周りにラッパースタブ関数をopen()プリロードclose()するpoll()
  2. RAMディスクに作成されたファイル名に関連情報を記録します。

(実際の問​​題は、カーネルがメモリpoll()にアクセスpollfdして戻ってくるという競争でしたEFAULT。)

于 2013-12-18T17:29:36.447 に答える