访问嵌套结构时出现段错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问嵌套结构时出现段错误相关的知识,希望对你有一定的参考价值。

我在下面使用kinfo_getproc

int main() {

    struct kinfo_proc *kp;

    kp = kinfo_getproc(getpid());


    printf("kp: %p
", kp);
    // kp:  0x801216000

    printf("&kp: %p
", &kp);
    // &kp: 0x7fffffffeac0

    printf("&thread: %p
", &kp->ki_tdaddr);
    // &thread: 0x801216398


    printf("&thread->td_dupfd: %p
", &kp->ki_tdaddr->td_dupfd);
    // &thread->td_dupfd: 0xfffff801564d3650

    // segfault accessing contents of td_dupfd
    //printf("thread->td_dupfd: %d
", kp->ki_tdaddr->td_dupfd);

    return 1;
}

当我尝试访问kp结构中的结构时,程序会出现段错误。

我从其他帖子中读到,问题很可能是结构没有正确分配?以下内容来自kinfo_getproc的手册页:

RETURN VALUES
   On success the kinfo_getproc() function returns a pointer to a struct
   kinfo_proc structure as defined by <sys/user.h>.  The pointer was
   obtained by an internal call to malloc(3) and must be freed by the caller
   with a call to free(3).  On failure the kinfo_getproc() function returns
   NULL.

如果返回值是指向已经被kinfo_structed的malloc的指针,那么不应该访问嵌套结构吗?我应该如何正确访问kp中的嵌套结构?

答案

我弄清楚我的问题是什么。

kp->ki_tdaddr的值是驻留在内核空间中的地址。换句话说,kp->ki_tdaddr是一个指向内核内存结构的指针 - 它不能直接从用户空间访问,因此也就是段错误。

要做的是使用kp->ki_tdaddr(内核空间地址)中的值与kvm_read()将内核空间中的位传输到用户空间。

码:

int main() {

    struct thread thread;

    /* a structure with process related info */
    struct kinfo_proc *kp = kinfo_getproc(getpid());

    /* a descriptor to access kernel virtual memory */
    kvm_t *kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL);

    /* transfer bytes from ki_tdaddr to thread */
    kvm_read(kd, (unsigned long) kp->ki_tdaddr, &thread, sizeof(thread));

    /* can now access thread information */
    printf("thread id: %jd
", (intmax_t) thread.td_tid);

    return 1;
}

以上是关于访问嵌套结构时出现段错误的主要内容,如果未能解决你的问题,请参考以下文章

初始化数组时出现段错误

尝试初始化结构数组时出现段错误

C ++:访问unordered_map中的数据时出现段错误以设置

分配结构数组时出现段错误

尝试访问向量中对象中的字段时出现段错误

[访问 我以前可以访问的功能时出现段错误