看了本书第十章,我学习到了:
1.printk函数:运行在内核空间,linux驱动只能用printk来打印内核调试信息。函数原型:asmlikage int printk(const char *fmt)。第一个参数表示格式字符串,后面是可变参数,第一个参数若为KERN_DEBUG和KERN_WARNING,值分别为<7>、<4>,数字表示输出的日志级别,默认为KERN_WARNING。该函数既可以将日志信息写入到日志文件,也可将日志信息写到控制台。Printk文件输出日志信息的输出方向。
查询日志信息:#dmesg 或#cat /var/log/syslog或 #cat /var/log/messages(低版本)或#cat /proc/kmsg(开发板没syslog、messages文件)
日志文件很多过滤显示内容:#dmesg | gerp printk或#cat /var/log/syslog | grep printk或#tail –n 10 /var/log/syslog
2.大量使用printk函数会影响linux驱动性能,解决方法是利用c语言编译指令(#if、#else、#endif)注释。
3./proc虚拟文件系统:是内存映射,对/proc的操作都是对内存的读写,用来进行内核空间与用户空间进行数据交互,与设备文件系统/dev类似,读写速度比/dev快。
查看当前系统内存资源:#cat /proc/meminfo
/proc设置动作处理函数:通过函数指针proc_dir_entry.read_proc、proc_dir_entry.read_write
proc_dir_entry结构体代表一个虚拟文件或目录,proc_mkdir,create_proc_entry, create_proc_read_entry,remove_proc_entry函数都包含了proc_dir_entry结构体的参数。
4.create_proc_read_entry是内部通过调用create_proc_entry函数实现的,通过mode参数设置文件的读写的属性,如0666即-rw-rw-rw-读写,0444即-r—r—r—只读。
5.删除虚拟目录之前需要先删除虚拟目录中的虚拟文件。
6.用gdb调试用户空间的程序:
编译:#gcc –static –g –o gdb_debug /root/drivers/debug/gdb_debug.c
调试:gdb gdb_debug
调试命令:
list:显示上次调用list命令输出最后一行后面的10行。list - : 显示上次调用list命令输出最后一行前面的10行。list n :显示第n行附近的10行。
break n:将指定行设为断点。tbreak n:将指定行设为断点,断点仅使用一次,使用完自动清除。
clear n:清除指定行的断点。
run:其后可跟命令行参数回传给正调试的程序。
cont/contiunue:跳过当前断点继续执行。
next:跳过这一程序继续执行下面语句(step over)。 nexti:单步执行语句,跟踪到子程序内部(step into)。
print var_name:查看变量值。
7.用gdbserver远程调试用户空间程序:
① 在安卓模拟器上调试:
将gdb_debug上传到安卓模拟器,进入模拟器终端,进入data/local目录,执行:#gdbserver :(本机端口) ./gdb_debug 监听程序
再开启另一个linux终端,执行#adb –s emulator-5554 forwardtcp:(端口号) tcp:(端口号 将外部模拟器的端口数据包转发到模拟器内部端口。
在linux终端执行:#arm-none-linux-gnueabi-gdb gdb_debug 进入gdb控制台连接安卓模拟器:#(gdb) target remote localhost :(端口号)
②在开发板上调试:(可通过端口映射——IP连接方式;串口连接)
一、IP连接:
在开发板端执行:#gdbserver localhost:(端口号) ./gbd_debug
在linux端gdb控制台执行:#(gdb) target rremote (开发板ip地址) ./gdb_debug 连接开发板的gdbserver
二、串口连接:
在开发板执行:#gdbserver /dev/(开发板上串口的设备文件) ./gdb_debug
Linux端gdb控制台执行:#(gdb) target remote /dev/ttyUSB0 连接开发板的gdbsserver
8.kgdb最好的内核调试工具,提供类似printk函数的日志输出功能,允许开发人员直接在PC上通过GDB链接目标设备。
9.Kgdb包含两部分:kgdb内核和一套连接接口。这些接口目前支持串口tty设备连接和以太网连接。串口连接需要内核参数kgdboc指定要连接的串口tty设备,以太网连接通过内核参数kgdboe指定ip和端口号。Kgdb支持多处理架构,单独为每个支持的处理器架构实现了kgdb内核。
10.kgdb远程调试内核程序:
① 配置linux内核:#make menuconfig 进入linux配置菜单——“Kernel hacking”——“KGDB:kernel debugger”
② 配置内核参数:在开发板启动过程中回车进入Uboot模式,使用setenv命令设置Linux内核启动参数,最后saveenv命令保存reset命令重启Linux内核。
③ 主机调试linux内核:#gdb ./vmlinux