1

Linux から *bsd に移植するデバッガーがあります。現在、私は OpenBSD バージョンに取り組んでいます。

特定の条件下で、配信された信号の詳細を知りたいです。たとえば、SIGSEGV が配信されたとします。エラーが発生したアドレスは何か、可能であれば、それが読み取りまたは書き込みのどちらであったかを知りたいと思います。

別の例として、トラップを受け取った場合、それはシングル ステップ イベントでしたか? または多分INT3オペコード。

Linux では、次のように呼び出してこの情報を取得します。

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

これは、信号について知りたい可能性のあるほぼすべてにアクセスできるため、うまく機能します。OpenBSD には同等のものはないようです。kinfo_procKVM API を使用してアクセスできるとを調べましたkinfo_proc2 が、siginfo_t と同じタイプの情報を持っているとは思えません。この情報を入手する正しい方法は何でしょうか?

4

1 に答える 1

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アーチにも何かがあるでしょう;-)。

于 2010-10-12T23:05:37.563 に答える