系统相关
首页 > 系统相关> > 如何调试Linux内核模块`init()`中的问题?

如何调试Linux内核模块`init()`中的问题?

作者:互联网

我正在使用远程(k)gdb调试模块中的问题,该问题在加载时会引起恐慌,例如调用init()时.

堆栈跟踪仅显示do_one_initcall(mod-> init)导致崩溃.为了将符号文件加载到gdb中,我需要获取模块文本部分的地址,并且要获取,我需要加载模块.

因为busybox(1.16.1)中的insmod不支持-m,所以我坚持使用grep modulename / proc / modules添加nm的偏移量来找出地址.

所以我在这里面临一个鸡和鸡蛋的问题-为了能够调试模块加载,我需要加载模块-但是为了加载模块,我需要调试问题. ..

因此,我目前正在考虑两个选项-是否可以获取地址信息之一:

>通过模块初始化代码中的printk()
>通过printk()在内核代码中的某个位置

在调用mod-> init()之前所有这些操作-因此我可以在此处放置一个断点,加载符号文件,点击c并查看它崩溃并烧毁…

解决方法:

您可以将代码构建到内核中而不是模块中吗?这样可以简化调试init()调用.

您也可以在do_one_initcall()处设置一个断点,并查看mod-> init的地址以获取加载地址.

标签:debug-symbols,remote-debugging,kernel-module,linux
来源: https://codeday.me/bug/20191024/1918218.html