内核panic 定位方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内核panic 定位方法
内核panic时,一般会打印回调,并打印出当前出错的地址。
要快速定位出错的代码行,可以采取以下步骤:
1. 在代码编译连接时,每个函数都有起始地址和长度,这个地址是程序运行时的地址,而函数内部,每条指令相对于函数开始地址会有偏移。
有了地址以后,就可以定位到该地址落在哪个函数的区间内,然后找到该函数,进而通过计算偏移,定位到代码行。
2. 如果拿到的日志文件所在的系统版本跟当前的代码版本不一致,那么编译后的地址就会有差异。
那么简单地直接通过地址就可能找不到原来的位置,这个就可能需要回调里头的函数名信息。
先通过函数名定位到所在函数,然后通过偏移定位到代码行。
3. 相应的工具有addr2line、gdb、objdump等。
但是要注意的是,代码的实际运行是不需要符号的,只需要地址就行。
所以如果要调试代码,必须确保调试符号已经编译到内核中,不然,回调里头打印的是一堆地址,根本看不到符号,那么对于上面提到的情况二而言,将无法准确定位问题。
4. 如果出错的内核跟当前需要调试的内核一致,而且编译器等都一致,那么可以通过addr2line直接获取到出错的代码行。
5. 生成模块可调试文件:确保编译内核时EXTRA_CFLAGS参数添加-g,如此编译后会生成内核模块对应的.o文件(假设为),使用编译工具链ld (交叉编译时需要使用交叉编译工具链),命令如下:ld -r -d -o 。
6. gdb调试:gdb 。
假设偏移地址为0xa7d0,则info line0xa7d0便得到panic时的位置信息。
7. 如果出错地址为内核,则不需要计算偏移地址,直接使用出错地址即可。
使用gdb 调试vmlinux,注意不是vmlinuz,方法基本与内核模块类似。
总的来说,要定位到出错的代码行需要多方面的工具和信息,建议咨询专业技术人员获取帮助。