Linux Debugging ls,ps,top,etc. printk() /proc i386提供的调试机制(断点,信号,单步执行) ptrace()系统调用 利用/proc/kcore SGI公司OSS项目的kgdb 嵌入式系统 Linux Debug
printk() 在用户态,一般用printf()在可能出问题的地方打印出系统运行状态。在内核态,对应的函数是printk() 由函数printk()打印出来的信息都被系统守护神进程syslogd记录,存放在/var/log/messages 如果记录级别小于当前系统中定义的console_loglevel值(include/linux/kernel.h: 29-36),那么应该将信息打印在当前控制台上 报错,printk("proc_read_super: get root inode failed\n"); 系统状态,printk(“jiffies-> %ld.\n”, jiffies); Linux Debug
用/proc在用户态查看Linux内核状况 系统综合信息 procinfo 进程信息 /proc/self/status 内存信息/proc/meminfo /proc/sys更改系统配置,i.e. /proc/sys/fs/file-max /proc下文件、目录的意义,“proc下的文件.doc” /proc/sys下文件、目录的意义, “proc_sys下的文件.doc” Linux Debug
/proc/<pid>/下文件、目录的意义 文件/目录名 描述 Cmdline 该进程的命令行参数 Cwd 进程运行的当前路径的符号链接 Environ 该进程运行的环境变量 Exe 该进程相关的程序的符号链接 Fd 包含该进程使用的文件描述符 Maps 可执行文件或库文件的内存映像 Mem 该进程使用的内存 Root 该进程所有者的家(home)目录 Stat 进程状态 Statm 进程的内存状态 Status 用易读的方式表示的进程状态 Linux Debug
断点 断点的分类(指令断点和数据断点) 指令断点:运行到这条指令的时候中止程序运行 数据写:数据对这个线性地址写的时候中止程序运行 数据读或者写:指令没有执行,只要发生该地址的数据读或者写就中止程序的运行 int3自陷指令设置指令断点 调试寄存器DR0 – DR3设置指令断点和数据断点 Linux Debug
调试寄存器 DR0 – DR3:保存断点相关的线性地址,包括指令断点和数据断点。使用线性地址 DR4、DR5由Intel公司保留 只有在特权级为0的时候才能访问这些寄存器 Linux Debug
Linux调试处理 int 3单字节异常指令,系统进入异常处理状态。用do_int3()函数响应 int 2触发系统的debug调试异常,用do_debug()函数响应 task_struct{}的thread_struct{}有成员变量 unsigned long debugreg[8] Linux Debug
Signal 举例说,进程出现浮点运算错误时,进程会接收到SIGFPE信号,在正常运行的状况下,会产生core dump,从而导致程序非正常退出; 在调试的情况下,调试器接收到SIGFPE信号,就可以在产生错误的代码处,检查当时浮点操作数的值是否正常 对于PTRACED进程(PF_PTRACED置位),被调试进程在收到任何信号的时候(SIGKILL除外),都会中止进程的运行,并且通知调试器进程(父进程);收到SIGKILL信号就导致被调试子进程的直接退出 Linux Debug
单步中断处理程序在do_debug()的函数过程中 单步运行 标志寄存器EFLAGS中的TF标志 当调用ptrace()的PTRACE_SINGLESTEP功能,ptrace()会将TF置位,并且让进程继续运行。当进程回到用户态并且执行了一条指令之后,CPU产生异常,被中断的指令把线性标志寄存器推入堆栈,然后再清除TF位,使单步中断处理程序可以正常的运行。 单步中断处理程序在do_debug()的函数过程中 Linux Debug
通过使用Linux提供的ptrace()系统调用,可以让父进程监控子进程。 使用ptrace()系统调用,可以用来改变调试寄存器的内容,包括添加断点地址,改变断点控制寄存器的值。也可以改变子进程中ptrace成员的值,这是在进程运行过程中判断调试状态情况的最重要的成员 Linux Debug
ptrace请求类型 “ptrace请求类型宏定义.doc” Linux Debug
用户空间的ptrace()调用方法 #include <sys/ptrace.h> long int ptrace(enum __ptrace_request request, pid_t pid, void * addr, void *data) request: ptrace的请求类型 pid: 作用的对象 addr和data:传入的地址和数据 对不同的请求类型来说,addr和data所代表的意义不尽相同。“ptrace调用方式.doc” Linux Debug
ptrace()调用机制/流程 “ptrace调用简单流程.doc” Linux Debug
/proc/kcore /proc/kcore文件是系统内核运行情况的内存映像 如果编译内核的时候增加-g选项,即会在生成的二进制代码vmlinuz或vmlinux中,添加调试相关的数据。 以root身份运行 #gdb /usr/src/linux/vmlinux /proc/kcore 因为core-file命令是静态的,如果需要查看内核最近的运行情况,需要再次运行core-file将新的/proc/kcore导入,否则就只能是上次使用core-file的情况 Linux Debug
一次示例 # gdb vmlinux (gdb) core-file /proc/kcore #0 0x0 in ?? () (gdb) p jiffies $1 = 29119787 $2 = 29119787 $3 = 29122291 (gdb) Linux Debug
SGI公司OSS项目的kgdb Linux Debug
嵌入式系统的组成 微处理器(MCU、DSP、SOC) 存储器(内存、Flash) 人机交互界面 网络接口 其它输入和输出装置 软件系统 有限的功能 实时性、系统可靠性方面的考虑 Linux Debug
ARM公司的ARM Evaluator-7T Lineo的µCSimm 嵌入式系统开发平台 ARM公司的ARM Evaluator-7T Lineo的µCSimm Linux Debug
µCSimm Linux Debug
µCSimm l 16MHz,2.7 MIPS EC000 CPU Core l 8MB DRAM l 2MB Flash ROM l 30针SIMM form factor l 3.3V电压下最大电流为100mA l low power sleep mode l 板载µClinux操作系统 l RS232串口 l SPI serial master l 最高为QVGA的LCD控制器 l Up to 19 parallel I/O l 10BaseT 以太网 Linux Debug
µCsimm调试环境 µClinux操作系统 一张µClinux System Builder Kit光盘 linux.bin文件是编译后的µClinux内核,将传输到µCsimm上运行 µCsimm上有Bootloader装入linux.bin 主机通过RS232与µCsimm相连。主机使用串口的终端工具minicom与串口通信 Linux Debug
ARM Evaluator-7T ARM7TDMI处理器,包括了THUMB®指令集。 Samsung KS32C50100 微控制器 工作频率可以高达50MHz 512KB FLASH 512KB+ 32位 SRAM Flash中的 Bootstrap Loader Angel debug monitor MicroHAL 完全MultiICE兼容的JTAG 接口,包括reset和hot-swap功能 软件开发工具ARM Developer Suite(ADS) Linux Debug
嵌入式系统软件开发过程 建立交叉开发环境 交叉编译和连接 重定位和下载 调试 Linux Debug
调试示意图 Linux Debug