2010-07-05 6 views
3

Следующее мое требование.Stack Walk on linux с использованием ptrace

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

  1. Приложить процесс A от B с помощью PTRACE_ATTACH.
  2. Запустите Loop
  3. Стоп Процесс A
  4. чтения регистры
  5. Резюме Процесс A
  6. сон (1)
  7. конец петли
  8. отсоединять

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

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

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

+0

http://social.msdn.microsoft.com/Форумы/en/netfxtoolsdev/thread/4f21d7d8-d30e-4754-a0f6-dc2da3b75c40 релевантная ссылка для windows .. –

+0

, пожалуйста, отправьте свой код – osgx

+0

kill(), чтобы остановить, а PTRACE_CONT - это правильная комбинация. Большинство отладчиков используют SIGINT (вместо SIGSTOP), чтобы остановить процесс, вы можете попробовать это. Но я предполагаю, что вы сделали еще одну ошибку, вам придется опубликовать свой код. – Fabian

ответ

0

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

+0

нет, я не использовал отладчик GNU .. –

1

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

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; 

} 

прошел сигнал -

убийство -STOP 17779 убийство -STOP 17779

Выход А -

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 

Мы видим, что В отображает значение EIP для каждый сигнал доставляется клиенту. В основном сигнал не доставляется A, а B пробуждается и анализирует EIP, а затем продолжает цикл. Вы можете изменить код, чтобы доставить сигнал, если хотите.

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