内核oops在双指针取消引用

时间:2017-05-31 11:50:58

标签: c pointers linux-kernel

我在linux内核中遇到NULL指针解除引用问题。在PC上使用addr2line我可以在代码中获取行号。但是这个oops发生的行是双指针解除引用。

eg. xx->yy->zz

这里我们在一行中取消引用xx和xx-> yy。

addr2line -f -e vmlinux c03200f8
func
lmn/uva/hello.c:101

101: if(xx->yy->zz==hello)

那么如何知道哪个字段是NULL xx或xx-> yy?

2 个答案:

答案 0 :(得分:2)

在内核源代码树中有脚本/解码代码。一旦你给它提供oops,你就可以围绕崩溃的指令进行人工可读的组装。

您必须从那里分析它如何适合源树。对于任何进行内核编程的人来说,这是一项强制性技能,并且在大多数情况下并不难。一个简单的快捷方式是检查取消引用字段的偏移量,并查看它与崩溃地址的关系。

答案 1 :(得分:0)

通常,为避免使用类型的NULL指针取消引用,我们使用样式

  if (xx && xx->yy)

其中,仅当xx不为NULL时才评估取消引用。

根据短路运算符属性,在这种情况下,逻辑AND,仅当LHS被评估为TRUE时才评估RHS操作数。所以,对于上面的例子,

  • xx为NULL时,禁止取消引用。
  • xx不为NULL时,将取消引用。
  

那么如何知道哪个字段是NULL xx或xx-> yy

如果您想知道指针的NULL值,则分解操作,调试打印并再次运行。这是一个通用的建议。