-->

什么是问号的意思“?” 在Linux内核恐慌的呼叫痕迹?(What is the meaning

2019-07-03 09:54发布

呼叫跟踪包含类似的条目:

 [<deadbeef>] FunctionName+0xAB/0xCD [module_name]
 [<f00fface>] ? AnotherFunctionName+0x12/0x40 [module_name]
 [<deaffeed>] ClearFunctionName+0x88/0x88 [module_name]

是什么意思“?” 马克AnotherFunctionName过吗?

Answer 1:

'?' 意味着这个堆栈条目中的信息可能是不可靠的。

堆输出机制(见实施dump_trace()函数 )未能证明其已发现该地址是在调用栈一个有效的返回地址。

'?' 本身是由输出printk_stack_address() 。

该堆栈条目可以有效还是无效。 有时候,一个简单的跳过它。 这可能有助于调查所涉及的模块的拆解,看看哪些函数被调用在ClearFunctionName+0x88 (或者,在x86上,在紧接该位置之前)。

关于可靠性

在x86,当dump_stack()被调用时,实际检查堆栈中的功能是print_context_stack()中所定义arch/x86/kernel/dumpstack.c 。 看看它的代码,我会尽力在下面解释它。

我认为DWARF2堆栈放松设施不你的Linux系统中可用的(最有可能的,他们都没有,如果不是的OpenSUSE或SLES)。 在这种情况下, print_context_stack()似乎做到以下几点。

它从一个地址(“栈”中的代码变量)开始被保证是一个堆叠位置的地址。 它实际上是一个局部变量的地址dump_stack()

该功能反复地增加该地址( while (valid_stack_ptr ...) { ... stack++}并检查它指向也可能是在内核代码的地址( if (__kernel_text_address(addr)) ... )。 这样,它试图查找功能返回地址栈上推时,这些函数被调用。

当然,并不是每一个无符号长值,看起来像一个返回地址实际上是一个返回地址。 所以函数试图检查。 如果帧指针在内核(%EBP /%RBP寄存器被用于,如果CONFIG_FRAME_POINTER被设置)的代码中使用,它们可以被用于遍历的函数的堆栈帧。 的返回地址的函数恰好位于帧指针之上(即,在%ebp/%rbp + sizeof(unsigned long) )。 print_context_stack检查这一点。

如果有一个堆栈帧为其值“堆”指向的是返回地址,该值被认为是可靠的堆栈条目。 ops->address将被称为用于其与reliable == 1 ,它最终将调用printk_stack_address()和的值将是作为一个可靠的调用堆栈条目输出。 否则,地址将被视为不可靠的。 这将是无论如何输出但“?” 前缀。

[NB如果帧指针信息不可用(例如,就像是在Debian中6默认情况下),所有调用堆栈条目会被标记为这个原因为不可靠的。

与DWARF2平仓支持(与CONFIG_STACK_UNWIND套)该系统是一个整体另一个故事。



文章来源: What is the meaning of question marks '?' in Linux kernel panic call traces?