现在的位置: 首页 > 苹果驱动开发 > 正文
[Mac OS X]内核_驱动调试:kernel panic 调试&分析
2012年09月17日 苹果驱动开发 ⁄ 共 2173字 暂无评论 ⁄ 被围观 2,105 views+
扫描仪打印机USB驱动程序开发外包

如果你在编写[Mac OS X] 内核、驱动碰到死机问题,即kerne panic,那么以下文章可以帮助你定位死在内核空间的哪一个点上,死在哪一行代码上。当然,如果你是Mac内核or驱动开发人员,这个是必须掌握的[Mac OS X] 内核、驱动调试技能。

[Mac OS X] 内核、驱动调试:苹果官方文档:Technical Note TN2063: Understanding and Debugging Kernel Panics

什么是Kernle Panic?

Kernel Panic 指的是被系统内核检测到的、不可恢复的系统错误。最常见的就是对内存进行非法读写操作,还有一大堆在在mach_kernel、系统自带驱动里面捕获到的异常现象(这个在Mac OS X中系统驱动的开源代码中有体现,在代码上体现出来的就是在检测到异常的分支if else语句中调用panic()函数)。

如果你编写的[Mac OS X] 内核、驱动导致内核空间异常,那么就会产生kernel panic,同样Mac OS X的应用程序异常也会导致crash。

 

[Mac OS X] 内核、驱动调试:调试Kernel Panic的基本步骤:

1.查看系统自动生成的Kernel Panic Log,查看函数调用堆栈,判断是否跟你所开发的[Mac OS X] 内核、驱动相关。

发生kernel panic之后,在重启之后会自动弹出个窗口,里面点击一下Report、Detail,里面的就是kernel panic log了。另外,kernel panic log,在Console这个log专用应用程序里面是可以找得到的,所有程序crash、内核空间崩溃-kernel panic的log都会自动以文件形式保存在特定路径上,通过Console就可以快速找到。

至于是否跟你所开发的[Mac OS X] 内核、驱动相关:如果kernel panic log里面挂掉的函数调用堆栈中有你的所开发的[Mac OS X] 内核、驱动的类名,那肯定就脱不了关系了,或者有你的驱动所依赖的驱动,也可以跟你的驱动相关。


2.下载该系统所对应的Kernel Debug Kit,准备好你所开发的相关驱动及其符号表文件(“.dSYM”后缀的文件,是使用XCode编译时生成的)。下一步就是使用命令行工具kextutil或kernel debug kit中的createsymbolfiles工具生成所需要的符号文件,也就是使用gdb调试时需要的以“.sym”文件的符号文件。

 

a.下载Kernel Debug Kit.

10.6.2 build 10C540 以及以前的版本可以在这个链接获取。 (如果下载不了,链接不对,google一下即可)
10.6.2 build 10C540 之后的版本,可以在developer.apple.com里面的找到。注意!如果没账户的必须先注册个账户(免费),登陆之后,换不同关键词搜索下。

b.使用gdb调试时需要的以“.sym”文件的符号文件

具体生成步骤在Technical Note TN2063: Understanding and Debugging Kernel Panics里面搜索"kextutil"或者"createsymbolfiles"就有了,或者查看Kernel Debug Kit中的Read ME文档,这里就不赘述了。

这里要注意两点(个人习惯的可行方法,当然可能有其他手段可以成功生成符号表):

b1.如果只是生成系统驱动的符号表

按照Technical Note TN2063: Understanding and Debugging Kernel Panics中给出的命令即可.(其中kextload应该替换为kextutil,文档中没有刷新此部分)

kextutil -c -e -k/Volumes/KernelDebugKit/mach_kernel -n -z -r /Volumes/KernelDebugKit/ -s /tmp PanicDriver/build/Debug/PanicDriver.kext/

在生成某个驱动的“.sym”符号表时,会被要求输入该驱动所依赖的其他驱动的加载地址,如果kernel panic log的函数调用堆栈中出现了所依赖的其他驱动并且你也需要该信息的话,从kernel panic log里面会有所依赖的其他驱动的加载的地址的,键入即可。

当然,所有你键入了地址的驱动,都会在指定目录中生成对应的".sym"符号表文件,否则就没有咯!

 

b2.如何生成第三方驱动

如果是需要生成第三方驱动(也就是非系统本身自带的驱动)时,在桌面上新建一个文件夹tempDebugKit,把Kernel DebugKit里面的所有内容copy到tempDebugKit目录中,另外把三方驱动以及其.SYM文件copy到tempDebugKit中。

然后用以下命令生成.sym符号文件到 /tmp目录中。

kextutil -c -e -k   ~/Desktop/tempDebugKit/mach_kernel -n -z -r ~/Desktop/tempDebugKit -s /tmp ~/Desktop/tempDebugKit/PanicDriver.kext/

 

3.开始使用gdb调试。

几个简单的命令,主要添加一下函数堆栈中的驱动文件以及其符号表,然后查看函数堆栈里面的内容。具体直接看官方文档。





扫描仪打印机USB驱动程序开发外包

给我留言

您必须 [ 登录 ] 才能发表留言!

最活跃的读者

网站统计

    日志:69篇
    评论:0条
    分类:7个
    标签:150个
    链接:3个
    网站运行:3916天
最后更新:2017年8月3日
×