Как получить информацию о сигнале в отладчике во время ptrace? - PullRequest
1 голос
/ 13 октября 2010

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

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

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

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

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

Это прекрасно работает, поскольку позволяет мне иметь доступ практически ко всему, что я мог бы хотеть узнатьо сигнале.Похоже, что нет аналога на OpenBSD.Я посмотрел на kinfo_proc и kinfo_proc2, которые доступны через KVM API, но на самом деле ничто не выскакивает из меня, так как у меня есть информация того же типа, что и у siginfo_t.Как правильно получить эту информацию?

1 Ответ

0 голосов
/ 13 октября 2010

Я нашел хотя бы частичный ответ на мой вопрос с помощью 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 тоже будет что-то; -).

...