2010-10-12 95 views
1

我有一个调试器,我正在从linux移植到* bsd。目前,我正在研究OpenBSD版本。ptrace如何在调试器中获得信号细节?

在某些情况下,我想知道已交付信号的细节。例如,假设SIGSEGV已经交付,我想知道错误地址是什么,如果可能的话,如果它是读取或写入。

另一个例子是,如果我收到一个陷阱,是单步事件吗?或者可能是一个INT3操作码。

在Linux上,我得到通过调用得到这样的信息:

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

这个伟大的工程,因为它让我有机会到刚才的一切我可能想了解的信号。在OpenBSD上似乎没有相同之处。我看了一下kinfo_prockinfo_proc2,它们可以通过KVM API访问,但没有任何信息真正跳出来,因为它与siginfo_t具有相同类型的信息。得到这些信息的正确方法是什么?

回答

0

我已经发现至少部分回答我的问题使用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 
} 

这是几乎所有我想要的信息,我认为如果我能继续通过相关挖标题我将能够找到所有这些信息。希望其他BSD拱门也会有一些东西;-)。

相关问题