3

以下は私の要件です。

プロセスAの実行中。

  1. PTRACE_ATTACH を使用して B からプロセス A をアタッチします。
  2. ループを開始する
  3. プロセス A を停止
  4. レジスターの読み取り
  5. プロセス A の再開
  6. スリープ(1)
  7. エンドループ
  8. Aを切り離す

ループからプロセス A を開始して再開するという問題に直面しています。kill(pid、SIGSTOP)、kill(pid、SIGCONT)、PTRACE_CONTの組み合わせを試しました。しかし、うまくいきませんでした。

他の解決策はありますか?

前もって感謝します。サンディープ

4

3 に答える 3

1

次のコードは私のために働いており、要件を満たしているようです-

交流

#include<stdio.h>
int main()
{
   int i=0;
   printf("My PID is - %ld\n",getpid());
   while(i>=0)
   {
   }
   return 0;
}

Bc - プロセスの追跡

int main()
{
   int pid;
   int status;
   struct user_regs_struct regs;
   unsigned int eip;

   printf("Enter pid to trace : \n");
   scanf("%d",&pid);
   printf("PID to be traced - %ld\n",pid);

   ptrace(PTRACE_ATTACH,pid,0,0);
   if(errno)
   {
        perror("attach");
        return -1;
   }

   waitpid(pid,&status,WUNTRACED);

   printf("Process Stopped\n");
   while(1)
   {
      ptrace(PTRACE_GETREGS,pid,0,&regs);
      eip=ptrace(PTRACE_PEEKTEXT,pid,regs.eip,0);

      printf("EIP - 0x%08x, instruction executed - 0x%08x\n",regs.eip,eip);

      ptrace(PTRACE_CONT,pid,0,0);
      waitpid(pid,&status,WUNTRACED);
   }

   return 0;

}

信号通過 -

kill -STOP 17779 kill -STOP 17779

Aの出力 -

xxxxx!xxxxx:~/myPer/stack_overflow [135]$ ./A
My PID is - 17779

Bの出力 -

XXXXX!xxxxx:~/myPer/stack_overflow [121]$ ./B
Enter pid to trace :
17779
PID to be traced - 17779
Process Stopped
EIP - 0x080483e1, instruction executed - 0x00f87d83
EIP - 0x080483e5, instruction executed - 0x00b8fa79
EIP - 0x080483e5, instruction executed - 0x00b8fa79

B がクライアントに配信された各シグナルの EIP 値を表示していることがわかります。基本的に、信号は A に配信されず、代わりに B がウェイクアップして EIP を調べ、ループを続行します。必要に応じて、シグナルを配信するようにコードを変更できます。

これはあなたの質問から私が理解したものです。何か他のことを理解した場合はお知らせください。それに応じて回答を更新します

于 2012-11-04T23:45:56.217 に答える
0

ゼロから着手するのは非常に難しいプロジェクトのように聞こえます。GNUデバッガーを何らかの方法で活用することを検討しましたか?特に、 libgdb2と呼ばれる長期実行のサブプロジェクトがあります。これは、現時点では完成または安定にはほど遠いものの、目的に適している可能性があります。

于 2010-07-05T16:38:41.453 に答える
0

多くの IDE と同じ方法で、gdb とのスクリプト作成/インターフェースを試すことができます。http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/gdb/gdb-mi.htmlも参照してください。

于 2010-07-06T11:51:22.313 に答える