在ptrace中如何在调试器中获取信号细节?

时间:2010-10-12 22:00:17

标签: signals ptrace openbsd

我有一个调试器,我正在从linux移植到* bsd。目前,我正在研究OpenBSD版本。

在某些条件下,我想知道所传递信号的细节。例如,假设已经交付了SIGSEGV,我想知道错误地址是什么,如果可能的话,它是否是读或写。

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

在linux上,我可以通过调用

获取此信息
ptrace(PTRACE_GETSIGINFO, pid, 0, &siginfo);

这很有效,因为它让我可以访问我可能想知道的有关信号的所有信息。在OpenBSD上似乎没有相应的东西。我看了一下使用KVM API可以访问的kinfo_prockinfo_proc2,但是没有什么能像siginfo_t那样拥有相同类型的信息。获取此信息的正确方法是什么?

1 个答案:

答案 0 :(得分: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拱门也有其他东西; - )。