addr2line内核模块 [英] addr2line on kernel module

查看:3854
本文介绍了addr2line内核模块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想调试内核模块。我怀疑有没有一些内存泄漏。要检查它,我有prepared构建内核和模块启用内存泄漏调试。而我得到了一些来自警告:

I'm trying to debug kernel module. I suspect to have there some memory leaks. To check it I have prepared build with enabled Memory leak debugging for kernel and modules. And I got some warning from that:

[11839.429168] slab error in verify_redzone_free(): cache `size-64': memory outside object was overwritten
[11839.438659] [<c005575c>] (unwind_backtrace+0x0/0x164) from [<c0116ca0>] (kfree+0x278/0x4d8)
[11839.447357] [<c0116ca0>] (kfree+0x278/0x4d8) from [<bf083f48>] (some_function+0x18/0x1c [my_module])
[11839.457214] [<bf083f48>] (some_function+0x18/0x1c [my_module]) from [<bf08762c>] (some_function+0x174/0x718 [my_module])
[11839.470184] [<bf08762c>] (some_function+0x174/0x718 [my_module]) from [<bf0a56b8>] (some_function+0x12c/0x16c [my_module])
[11839.483917] [<bf0a56b8>] (some_function+0x12c/0x16c [my_module]) from [<bf085790>] (some_function+0x8/0x10 [my_module])
[11839.496368] [<bf085790>] (some_function+0x8/0x10 [my_module]) from [<bf07b74c>] (some_function+0x358/0x6d4 [my_module])
[11839.507476] [<bf07b74c>] (some_function+0x358/0x6d4 [my_module]) from [<c00a60f8>] (worker_thread+0x1e8/0x284)
[11839.517211] [<c00a60f8>] (worker_thread+0x1e8/0x284) from [<c00a9edc>] (kthread+0x78/0x80)
[11839.525543] [<c00a9edc>] (kthread+0x78/0x80) from [<c004f8fc>] (kernel_thread_exit+0x0/0x8)

有是翻译地址没有问题,它指向内核:

There is no problem to translate addresses which points to kernel:

$ addr2line -f -e vmlinux.kmeml c0116ca0
verify_redzone_free
/[...]/kernel/mm/slab.c:2922

但我不能这样做,如果地址是从my_module:

But I can't do that if addresses are from my_module:

$ addr2line -f -e vmlinux.kmeml bf0a56b8
??
??:0

我也与模块文件尝试:

I was also trying with module file:

$ addr2line -f -e my_module.ko bf0a56b8
??
??:0

如何翻译这个地址的文件和行号?

How can I translate this addresses to files and line numbers?

推荐答案

我假设模块包含内置有调试信息。如果是这样,你可以用GDB或者objdump的找出每个地址所属的源文件和行。事情是这样的:

I suppose the module is built with debug info included. If so, you can use gdb or objdump to find out which source file and line each address belongs to. Something like this:

$ gdb "$(modinfo -n my_module)"
(gdb) list *(some_function+0x12c)

GDB现在就告诉源文件的名称和它的行。

Gdb will now tell the name of the source file and the line in it.

您也可以对objdump的类似的事情,但它是比较困难的。首先,拆卸模块:

You can also do a similar thing with objdump but it is a bit more difficult. First, disassemble the module:

objdump -dSlr my_module.ko > my_module.disasm

在与 -S 选项调用,objdump的将包括在上市产生的源代码行适当。

When called with -S option, objdump will include the source lines in the resulting listing where appropriate.

您现在可以滚动列表下降到 some_function 的code,找到偏移0x12c从函数开始的指令。源线将它上面标明。

You can now scroll the listing down to the code of some_function, find the instruction at offset 0x12c from the beginning of the function. The source line will be indicated above it.

编辑:

经过多次实验,我发现,虽然 addr2line 确实可以用于内核模块,欧盟addr2line (从的elfutils)类似的工具似乎更加可靠。也就是说,有时 addr2line 输出不正确的源代码行,但欧盟add2line 做了正确的事情。

After many experiments, I found that although addr2line can indeed be used for kernel modules, eu-addr2line (a similar tool from elfutils) seems to be more reliable. That is, sometimes addr2line output incorrect source lines but eu-add2line did things right.

要使用欧盟addr2line ,人们可能需要安装libdw和libebl库,如果他们尚未与的elfutils一起安装。

To use eu-addr2line, one may need to install libdw and libebl libraries if they are not already installed along with elfutils.

用法类似的 addr2line

eu-addr2line -f -e <path_to_the_module> -j <section_name> <offset_in_section>

如果为内核模块调试信息存储在独立的文件(这通常是由主要Linux版本提供的内核的情况下),路径到该文件应被用作&下; path_to_the_module方式&gt;

If the debug information for a kernel module is stored in separate file (this is often the case for the kernels provided by the major Linux distros), the path to that file should be used as <path_to_the_module>.

这篇关于addr2line内核模块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆