2014-01-27 44 views
1

我想从我的内核模块打印多个点的当前寄存器值。 这是我使用的代码:如何从内核代码打印当前寄存器值?

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

这工作,但看起来像的背景下是不正确的。 例如,epc总是显示下面的值,虽然我有这个代码在我的文件中的多个地方。

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

即函数名永远是“kernel_thread_helper”。

在内核崩溃的情况下,我得到指点EPC值到我的函数名+偏移,e.g:

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

我在做什么错?

注意: 我没有能够直接使用show_regs的实际定义,因为它没有在内核代码中导出(所以我会得到一个'undefined symbol'错误)。 作为一种解决方法,我将show_regs函数牙列照原样复制到我的模块中。希望这不会引起任何问题。

+0

如果你想访问未导出的符号,我建议引用这个博客的最后一节。 http://onebitbug.me/2011/03/04/introducing-linux-kernel-symbols/ – Jeyaram

+0

还提到确切的拱。这将有助于分析。 – Jeyaram

+0

'current'是当前任务的宏。你在内核中,而不是内核任务,所以寄存器不会改变。使用'printk(“%s:%d \ n”,__function__,__line __);''更容易。你为什么要打印一个'PC'。 'show_regs()'的调用网站是已知的。 –

回答

2

明白了,下面的代码工程! :)

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