2010-07-05 19 views
3

Voici mes besoins.Stack Walk sur Linux en utilisant ptrace

alors que le processus A est en cours d'exécution.

  1. attacher le processus A à partir de B avec PTRACE_ATTACH.
  2. Démarrer une boucle
  3. Stop Process A
  4. registres de lecture
  5. processus de reprise A
  6. sommeil (1)
  7. boucle d'extrémité
  8. détachez une

je suis face à problème avec Démarrer et reprendre le processus A de la boucle. J'ai essayé la combinaison de kill (pid, SIGSTOP), kill (pid, SIGCONT), PTRACE_CONT. mais n'a pas fonctionné.

d'autres solutions s'il vous plaît?

Merci d'avance. Sandeep

+0

http://social.msdn.microsoft.com/Forums/fr/netfxtoolsdev/thread/4f21d7d8-d30e-4754-a0f6-dc2da3b75c40 lien pertinent pour les fenêtres .. –

+0

s'il vous plaît poster votre code – osgx

+0

kill() pour arrêter et PTRACE_CONT est de continuer est la bonne combinaison. La plupart des débogueurs utilisent SIGINT (au lieu de SIGSTOP) pour arrêter le processus, vous pouvez essayer cela. Mais je devine que vous avez fait une autre erreur, vous devrez poster votre code. – Fabian

Répondre

0

Cela ressemble à un projet très difficile à entreprendre à partir de zéro. Avez-vous envisagé de tirer parti du GNU debugger de quelque façon que ce soit? En particulier, il existe un sous-projet de longue durée appelé libgdb2 qui peut convenir à vos objectifs même s'il est loin d'être terminé ou stable à ce jour.

+0

non, je n'ai pas utilisé le débogueur GNU .. –

1

code suivant travaille pour moi et semble répondre à vos besoins -

Ac

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

Bc - processus Tracing

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; 

} 

Signal passé -

kill kill -STOP 17779 -STOP 17779

sortie de A -

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

sortie de 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 

On voit que B affiche une valeur EIP pour chaque signal délivré au client. Fondamentalement, le signal n'est pas remis à A, mais B se réveille et examine EIP, puis continue dans la boucle. Vous pouvez modifier le code pour délivrer le signal si vous le souhaitez.

Voici ce que j'ai compris de votre question. Si j'ai compris quelque chose d'autre s'il vous plaît faites le moi savoir et je mettrai à jour la réponse en conséquence