2010-10-12 2 views
1

J'ai un débogueur que je transfère vers * bsd à partir de Linux. Actuellement, je travaille sur la version OpenBSD.Comment obtenir les détails du signal dans le débogueur pendant que ptrace?

Dans certaines conditions, je voudrais connaître les détails du signal qui a été délivré. Par exemple, supposons qu'un SIGSEGV ait été livré, j'aimerais savoir quelle était l'adresse défaillante, et si possible si c'était une lecture ou une écriture.

Un autre exemple est si je reçois un piège, était-ce un événement en une seule étape? ou peut-être un opcode INT3.

Sur linux je reçois obtenir cette information en appelant:

ptrace(PTRACE_GETSIGINFO, pid, 0, &siginfo); 

Cela fonctionne très bien, car il me laisse avoir accès à peu près tout ce que je pourrais peut-être vouloir savoir sur le signal. Il ne semble pas y avoir d'équivalent sur OpenBSD. J'ai jeté un oeil à kinfo_proc et kinfo_proc2 qui sont accessibles en utilisant l'API KVM, mais rien ne m'apparaît vraiment comme ayant le même type d'information qu'un siginfo_t. Quelle serait la bonne façon d'obtenir cette information?

Répondre

0

J'ai trouvé au moins une réponse partielle à ma question en utilisant KVM:

char errbuf[_POSIX_LINE_MAX]; 
kvm_t *const kd = kvm_openfiles(NULL, NULL, NULL, O_READONLY, errbuf); 
if(kd != NULL) { 
    int rc; 
    struct kinfo_proc2 *const proc = kvm_getproc2(kd, KERN_PROC_PID, pid, sizeof(struct kinfo_proc2), &rc); 

    struct sigacts sigacts; 
    kvm_read(kd, proc->p_sigacts, &sigacts, sizeof(sigacts)); 

    // sigacts.ps_code is same as siginfo.si_code 
    // sigacts.ps_sigval.sival_ptr is same as siginfo.si_addr 
} 

C'est presque toutes les informations que je veux, je pense que si je peux continuer à creuser à travers la pertinente les en-têtes je serai en mesure de trouver toutes ces informations. Espérons que les autres arches BSD auront quelque chose aussi ;-).

Questions connexes