【问题标题】:How do I get signal details in debugger while ptrace?ptrace 时如何在调试器中获取信号详细信息?
【发布时间】:2010-10-12 22:00:16
【问题描述】:

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

在某些情况下,我想知道所传递信号的详细信息。例如,假设交付了一个 SIGSEGV,我想知道错误地址是什么,如果可能的话,是读取还是写入。

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

在 linux 上,我通过调用获取此信息:

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

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

【问题讨论】:

    标签: signals ptrace openbsd


    【解决方案1】:

    我使用 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 拱门也有一些东西 ;-)。

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多