• 《Android深度探索》读书笔记10


    看了本书第十章,我学习到了:

    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

  • 相关阅读:
    浅谈SQL Server中的事务日志(五)----日志在高可用和灾难恢复中的作用
    浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色
    浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
    Camera启动篇一
    【转】一篇不错的v4l2入门文档
    【转】open-drain与push-pull
    高通camera学习笔记五(actuator驱动参数解析)
    高通camera学习笔记四
    git精彩博文集锦
    【转】Git基础
  • 原文地址:https://www.cnblogs.com/cqj0818/p/5642066.html
Copyright © 2020-2023  润新知