来自内核的SIGSEGV

时间:2012-09-07 11:02:35

标签: c linux linux-kernel signals

我正在从用户空间程序动态修改(添加和删除)节点的链接列表。节点分配总是在用户空间中的几率是多少?

常用链接列表节点,

struct node {
  int x;
  struct node *next;
};

我得到了这个问题,因为当我遍历列表时,内核会向此用户空间进程发送一个SIGSEGV信号。每当我创建一个新节点时,我都会进行NULL指针检查。

此外,我知道如果进程尝试访问内核内存,内核会发送SIGSEGV信号。

3 个答案:

答案 0 :(得分:2)

SIGSEGV是一个分段错误。这意味着您的程序正在尝试访问不在程序分配的内存范围或段内的区域中的内存。分割是一个丑陋的系统,人们过去必须直接处理,但不再那么多了。今天对你来说意味着你的代码很可能是引用空指针或一些未初始化的值。

您应该做的是将调试器挂钩到您的程序,并查看导致SIGSEGV被抛出的地址。一旦你看到它,它很可能是0x0,或一些垃圾值,如0xDEADC0DE等。

可能您没有将节点中的所有指针都设置为0x0。在构造函数中执行此操作,并仔细检查addNode()removeNode()函数,以确保您没有悬挂的悬空指针。

答案 1 :(得分:1)

不要忘记设置next = NULL;在节点构造函数中,或仅在节点创建之后。 是的,分配总是在用户空间中完成

答案 2 :(得分:1)

  

节点的分配总是在用户空间中的几率是多少?

100%肯定。

  

当我遍历列表时,内核发送SIGSEGV信号

这意味着你的程序中存在一个试图访问la-la-land的错误。

  

我也知道,如果进程尝试访问内核内存,内核会发送SIGSEGV信号。

SIGSEGV是程序试图访问禁止内存时发送的POSIX标准信号。因此,不一定只是内核内存,而是您的进程可以访问的空间之外的任何内存。