我正在使用远程(k)gdb调试模块中的问题,该模块在加载时导致恐慌,例如调用init()
时。
堆栈跟踪只显示do_one_initcall(mod->init)
导致崩溃。为了获得在gdb中加载的符号文件,我需要获取模块文本部分的地址,并获得我需要加载模块。
因为busybox(1.16.1)中的insmod
不支持-m
,所以我坚持grep modulename /proc/modules
+添加nm
的偏移量来弄清楚地址。
所以我在这里遇到了一个鸡和蛋的问题 - 为了能够调试模块加载,我需要加载模块 - 但是为了让模块加载,我需要调试问题......
所以我目前正在考虑两种选择 - 是否有办法获取地址信息:
所有这一切都在调用mod->init()
之前 - 所以我可以在那里放置一个断点,加载符号文件,点击 c 然后看到它崩溃并烧掉......
答案 0 :(得分:5)
您可以将代码构建到内核而不是模块中吗?这可能会简化调试init()
调用。
您还可以在do_one_initcall()
设置断点,并查看mod->init
的地址以获取加载地址。