我在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?
答案 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值,则分解操作,调试打印并再次运行。这是一个通用的建议。