linux - 如何从内核代码打印当前寄存器值?

标签 linux linux-kernel kernel

我正在尝试从我的内核模块打印多个点的当前寄存器值。 这是我正在使用的代码:

struct pt_regs *regs = task_pt_regs(current);
show_regs(regs);

这可行,但看起来上下文不正确。 例如,epc 总是显示低于值,尽管我在文件中的多个位置都有此代码。

kernel: epc   : ffffffff8023a510 kernel_thread_helper+0x0/0x18

即函数名称始终为“kernel_thread_helper”。

如果发生内核 panic ,我会得到指向我的函数名称+偏移量的epc值,例如:

kernel: epc   : ffffffffc0087ef0 my_function+0x58/0xa0 [myModule]

我做错了什么?

注意: 我无法直接使用 show_regs 的实际定义,因为它没有在内核代码中导出(因此我将收到“ undefined symbol ”错误)。 作为解决方法,我将 show_regs 的函数齿列按原样复制到我的模块中。希望这不会引起任何问题。

最佳答案

明白了,下面的代码有效! :)

struct pt_regs regs;
prepare_frametrace(&regs);
show_regs(&regs);

关于linux - 如何从内核代码打印当前寄存器值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21375329/

相关文章:

Windows 7 x86 使用 sysenter 执行直接系统调用

c++ - 二进制文件和操作系统

linux - 为什么 wso2 服务器不能从 wso2 用户运行?

linux - 将 'man grep' 命令输出到文件中

mysql - 在 Perl 中安装 DBI 模块面临问题

c - 使用您自己的页面错误处理程序

linux - 中断处理程序中的上下文切换

c - 错误协议(protocol) 41 >= NPROTO(41) 向 linux 内核添加新协议(protocol)

linux - 内核安装给出缺少模块错误

c++ - windows下驱动程序编程入门方法