Stack Walk на Linux с использованием ptrace - PullRequest
3 голосов
/ 05 июля 2010

Следующее мое требование.

во время работы процесса A.

  1. присоединение процесса A из B с помощью PTRACE_ATTACH.
  2. Запуск цикла
  3. Останов процесса A
  4. чтение регистров
  5. Возобновление процесса A
  6. sleep (1)
  7. конец цикла
  8. отсоединение A

Я столкнулся с проблемой запуска и возобновления процесса A из цикла.я попробовал комбинацию kill (pid, SIGSTOP), kill (pid, SIGCONT), PTRACE_CONT.но не сработало.

Любые другие решения, пожалуйста?

Заранее спасибо.Sandeep

Ответы [ 3 ]

1 голос
/ 05 ноября 2012

Следующий код работает для меня и, кажется, соответствует вашим требованиям -

Ac

#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, а затем продолжает цикл.Вы можете изменить код, чтобы доставить сигнал, если хотите.

Это то, что я понял из вашего вопроса.Если я понял что-то еще, пожалуйста, дайте мне знать, и я обновлю ответ соответственно

0 голосов
/ 06 июля 2010

Вы можете попробовать сценарии / взаимодействие с GDB так же, как это делают многие IDE.Смотри также http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/gdb/gdb-mi.html

0 голосов
/ 05 июля 2010

Звучит как очень сложный проект, который нужно начинать с нуля. Рассматривали ли вы каким-либо образом использовать отладчик GNU ? В частности, существует длительный подпроект под названием libgdb2 , который может удовлетворить ваши цели, даже если он еще далек от завершения или стабилен.

...