mac os debug

来源:互联网 发布:淘宝店标的网站 编辑:程序博客网 时间:2024/05/27 14:14

转载自:http://blog.csdn.net/ken_81515229/article/details/6776764



苹果官方文档:Technical Note TN2063: Understanding and Debugging Kernel Panics

阅读上述文档,就是可以调试kerne panic (也就是Mac 上的死机),找到死机是死在内核空间的哪一个点上,死在哪一行代码上。当然,如果你是Mac内核or驱动开发人员,这个或许是必须掌握的技能。



什么是Kernle Panic?

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

(内核空间异常就会产生kernel panic,应用程序异常就会crash掉。其实都是一样的,就是异常挂了...)


调试Kernel Panic的基本步骤:

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

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

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


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调试。

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





原创粉丝点击