栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

堆栈输出机制(请参见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(unsignedlong)
)。print_context_stack对此进行了精确检查。

如果存在一个栈帧,其值“ stack”指向的是返回地址,则该值被视为可靠的栈条目。

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

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390836.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号