如何调试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