2010-10-12 29 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拱門也會有一些東西;-)。