当前位置: 首页 > 面试题库 >

问号“”是什么意思?在Linux内核中的紧急呼叫跟踪?

左丘修齐
2023-03-14
问题内容

呼叫跟踪包含如下条目:

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

‘是什么意思?标记在AnotherFunctionName之前?


问题答案:

‘?’ 表示有关此堆栈条目的信息可能不可靠。

堆栈输出机制(请参见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()似乎可以执行以下操作。

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

该函数反复递增该地址(while (valid_stack_ptr ...) { ... stack++}),并检查其指向的内容是否也可能是内核代码(if (__kernel_text_address(addr)) ...)中的地址。这样,当这些函数被调用时,它将尝试查找推入堆栈的函数的返回地址。

当然,并非每个看起来像返回地址的无符号long值实际上都是一个返回地址。因此该函数尝试对其进行检查。如果在内核代码中使用了帧指针(如果设置了CONFIG_FRAME_POINTER,则使用%ebp
/%rbp寄存器),则可以使用它们遍历函数的堆栈帧。函数的返回地址位于帧指针的上方(即%ebp/%rbp + sizeof(unsigned long))。print_context_stack对此进行了精确检查。

如果存在一个栈帧,其值“ stack”指向的是返回地址,则该值被视为可靠的栈条目。ops->address将被调用reliable == 1,最终将被调用,printk_stack_address()并且该值将作为可靠的调用堆栈条目输出。否则,该地址将被视为不可靠。无论如何都将输出,但带有“?”
前置。

[NB]如果帧指针信息不可用(例如默认情况下在Debian 6中是这样),则出于这个原因,所有调用堆栈条目都将被标记为不可靠。

具有DWARF2展开支持(并设置了CONFIG_STACK_UNWIND)的系统则完全是另外一回事了。



 类似资料:
  • 问题内容: 在Linux内核源代码中,我找到了以下功能: 在这里我不明白这意味着什么。 问题答案:

  • 问题内容: 从这里 我没有得到它的含义以及为什么使用它。我试图搜索它,但不了解其含义。 问题答案: 它使动态加载的模块可以访问符号(前提是所述模块添加了声明)。

  • 问题内容: 我读到Linux内核是抢占式的,这与大多数Unix内核不同。那么,内核抢占到底意味着什么呢? 一些类比或示例将比纯理论解释更好。 添加2018年1月1日-11:00 AM 抢占式只是多任务处理的一种范例。还有其他类似协作多任务处理。通过比较它们可以更好地理解。 问题答案: 想象一下抢占式多任务的简单视图。我们有两个用户任务,它们都一直在运行,而没有使用任何I / O或执行内核调用。这两

  • 问题内容: 如今,这个抓获了我的注意jQuery的API文档的选择: 到底是什么意思?我知道我可以在其中放置一个变量或jQuery对象作为上下文。这本身对我来说还不是很清楚, 但是我今天要问的特别是方括号逗号()。这是什么意思?我还在php.net的手册页上看到了类似的符号。 我错过了一些初步的课程吗?因为这对我来说很希腊,我不是唯一一个看过这个并以为是“ WTF …”的人,但是我却忽略了它,继续

  • 我一直在读丹·阿布拉莫夫的文章react as a rendering ui,看到了“紧急逃生舱”这个词。 我的问题是这是什么?有人能举一个例子吗?什么时候有用?

  • 问题内容: 在Python中像在C中一样具有特殊含义吗?我在Python Cookbook中看到了这样的函数: 你能向我解释一下还是指出我在哪里可以找到答案(Google将解释为通配符,因此我找不到令人满意的答案)。 问题答案: 假设知道位置和关键字参数是什么,下面是一些示例: 范例1: 如你在上面的示例中所见,函数签名中仅包含参数。由于d和k不存在,因此将它们放入字典。该程序的输出为: 范例2: