2017-10-24 6 views
0

実行中のすべてのプロセスのコマンドライン引数を取得しようとしています。これらのプロセスの中には、/ proc/$ {pid}/cmdlineの4096文字制限を超えるコマンド行があるため、そのprocfsファイルを読むことが私の要求を満たしていません。興味のあるプロセスは一時的なものかもしれないので、私は自分のpidを知るとすぐに/ proc/$ {pid}/memのスタックからコマンドライン引数を読むことができる必要があります。これは私のCコードでptraceを使ってそれらに接続する必要があります。死んだpidでptrace(PTRACE_DETATCH、pid、NULL、NULL)が呼び出されるとどうなりますか?

while (pid >= 0){ 
    intPtraceReturnValue = ptrace(PTRACE_ATTACH,pid,NULL,NULL); 
    if(intPtraceReturnValue != -1){ 
     wait(&intStatus); 
     readFromProcMem(pid); // function that handles /proc/${pid}/mem reading 
     intPtraceReturnValue = ptrace(PTRACE_CONT,pid,NULL,NULL); 
     wait(&intStatus); 
     intPtraceReturnValue = ptrace(PTRACE_DETATCH,pid,NULL,NULL); 
     printFoundCommandLineArgs(); // prints results. 
    } 
    pid = getNextPid(); // function that interrogates /proc for the next running pid. 
} 

時々PTRACE_ATTACH呼び出しが-1を返します。これは通常、パイプが呼び出されたときに発生し、この場合はptraceを呼び出すまでにコマンドライン引数が履歴に失われていると受け入れることができます。しかし、他のケースでは、ptraceが正常に接続されますが、PTRACE_CONTを呼び出してカーネルミューテックスが解放されるのを待っている間にプロセスが終了するので、私はデタッチできません。つまり、PTRACE_DETATCHの呼び出しは、intStatusがPTRACE_CONTの呼び出しによって0に設定されている場合は-1を返します。これを実行して数分後、私はpidに関連する記憶を見ることができません。時々、/ procのリストへの私のアクセスは拒否されるようです。他のケースでは、空の結果が得られます。私はptrace添付ファイルのテーブルがあり、ptraceが死んだpidでPTRACE_DETACHで呼び出されているため、十分にクリアされていないと考えられます。これは本当ですか?もしそうなら、手作業で添付ファイルをクリアするにはどうすればいいですか?もしそうでなければ、ptraceは/ procへのアクセスを妨害するでしょうか?私は、プログラムの他の要約された部分がptraceが関与していないときに個別に作業することを確認しました。私はこれがptraceのやや正統的ではないことを知っています。任意の考えは、あなたが複数の問題を持っている

+0

ちなみに私はgcc 4.4.7(要件ごと)を使用していますが、Lunixカーネル2.6.32-696.3.2.el6.x86_64 – thurmanukyalur

答えて

0

、私はコメントをあなたのコードでそれらを指摘するだろういただければ幸いです。

while (pid >= 0){ 
    intPtraceReturnValue = ptrace(PTRACE_ATTACH,pid,NULL,NULL); 
    // here you should call ptrace(PTRACE_INTERRUPT, pid, NULL, NULL) to stop the tracee 
    if(intPtraceReturnValue != -1){ 
     wait(&intStatus); 
     readFromProcMem(pid); // function that handles /proc/${pid}/mem reading 
     // the PTRACE_CONT and wait are unnecessary 
     // intPtraceReturnValue = ptrace(PTRACE_CONT,pid,NULL,NULL); 
     // wait(&intStatus); 
     // the PTRACE_DETACH is enough to trigger the process to continue running 
     intPtraceReturnValue = ptrace(PTRACE_DETATCH,pid,NULL,NULL); 
     printFoundCommandLineArgs(); // prints results. 
    } 
    pid = getNextPid(); // function that interrogates /proc for the next running pid. 
} 

あなたの質問から、問題が何であるかきれいではないですが、私はかなり確信しています上記の変更を適用すると、おそらくより良い結果が得られます。

+0

で実行しています。gccのptrace.hと異なるヘッダファイルをインクルードしていますか? – thurmanukyalur

+0

何ですか?いいえ、あなたのコードを使用しました –

+0

PTRACE_INTERRUPTは新しい機能ですか?私はあなたの提案ごとにそれを追加し、私のコードはコンパイルされませんでした。同様の質問を見て、元の質問に使用する必要があるコンパイラとLinuxカーネルに関する情報を追加しました。あなたの考えをありがとう。 – thurmanukyalur

関連する問題