2010-10-12 1 views
1

У меня есть отладчик, который я переношу на * bsd из linux. В настоящее время я работаю над версией OpenBSD.Как получить информацию о сигналах в отладчике во время ptrace?

При определенных условиях я хотел бы узнать детали сигнала, который был доставлен. Например, предположим, что SIGSEGV был доставлен, я хотел бы знать, что такое ошибочный адрес, и, если возможно, если он был прочитан или написан.

Другой пример: если я получаю ловушку, было ли это одноэтапным событием? или, возможно, код операции INT3.

В Linux я получаю эту информацию по телефону:

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

Это прекрасно работает, так как это позволяет мне иметь доступ к почти все, что я мог бы хотеть знать о сигнале. На OpenBSD не существует эквивалента. Я взглянул на kinfo_proc и kinfo_proc2, которые доступны с использованием API KVM, но на самом деле ничего не выпрыгивает на меня, поскольку он имеет тот же тип информации, что и 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 тоже будет что-то .-).