嵌入式Linux调试(Farsight).ppt
文本预览下载声明
写在前面 Linux内核或设备驱动程序的调试远比应用程序的调试繁琐、复杂! 调试内核的关键是对内核的深刻理解 要有汇编基础! 要有耐心! 要有好运! 2.4内核中对调试的支持 2.6内核中对调试的支持 使用printk进行调试 printk的记录等级 printk( KERN_WARNING “This is a warning\n”); printk( KERN_DEBUG “This is a warning!\n” ); printk( “No LogLevel is specified!\n” ); 可供使用的记录等级 用户空间的守护进程--klogd 用来从记录缓冲区获取内核消息; 只有日记级别小于console_loglevel,消息才能显示出来, console_loglevel的值可以通过sys_syslogd系统调用进行修改; 载入klogd时,可以使用-c标志改变终端的记录等级; 运行klogd后,消息将追加到/var/log/messages; 没有运行klogd,消息不会传递到用户空间,此时可以查看/proc/kmsg文件。 syslogd进程 保存klogd进程获取的内核消息到系统日志文件中; 默认的文件是/var/log/messages; 可通过/etc/syslog.conf文件重新配置; 如果没有运行klogd进程,数据将保留在循环缓冲区中,直到某个进程读取和缓冲区溢出为止。 调试信息数据流传递流程图 提高日志级别 要查看调试信息,必须提高日志级别; 读写/proc/sys/kernel/printk文件 [root@vm-2.6]#cat /proc/sys/kernel/printk 6 4 1 7 设置当前日志级别的命令 [root@vm-2.6]#echo 8 /proc/sys/kernel/printk strace命令 显示程序调用的所有系统调用 从内核接收信息,而且不需要以任何特殊的方式来构建内核。 -t:显示调用发生的时间 -T:显示调用花费的时间 -e:限定被跟踪的调用类型 -o:将输出定向到一个文件中 oops 产生oops的原因: 内存访问越界 非法指令 使用了NULL指针 使用了不正确的指针值 oops的内容: CPU寄存器内容 页描述符表的位置 其他信息 有问题的write程序 ssize_t faulty_write ( struct file *filp, const char __user *buf, size_t count, loff_t *pos ) { *(int *)0 = 0; return 0; } 有问题的read程序 ssize_t faulty_read ( struct file *filp, const char __user *buf, size_t count, loff_t *pos ) { int ret; char stack_buf[4]; memset(stack_buf,0xff,20); if(count 4) count=4; ret = copy_to_user(buf,stack_buf,count); if(!ret) return count; return ret; } oops产生时的转储信息 EIP: 0010: Unable to handle kerel paging request at virtual address ffffffff printing eip: ffffffff Oops: 0000[#5] SMP CPU: 0 EIP: 0060:[ffffffff] Not tainted EFLAGS:(2.6.6) EIP is at 0xfffffff eax:0000000c ebx:ffffffff ecxedx:bfffda7c esi:cf434f00 edi:ffffffff ebpesp:c27fff78 ds:007b es:007b ss:0068 oops产生时的转储信息(2) Process Head (pid:2331,threadinfo=c27fe000 task=c3226150)
显示全部