Linux内核调试和工具使用

7,重新启动内核,这时候目标机将会处于等待gdb连接的状况:

8,这时候进入开发机内核源码主目录下启动gdb: Gdb ./vmlinux 设置串口速率: (gdb) set remotebaud 115200 连接到被调试机: (gdb) target remote /dev/ttyS0

9,若连接成功, 则开发机屏幕显示如下(不同版本显示可能有所不同):

Remote debugging using /dev/ttyS0 breakpoint () at kgdbstub.c:1005

1005 atomic_set(&kgdb_setting_breakpoint, 0); warning: shared library handler failed to enable breakpoint (gdb)

输入以下命令,设置符号文件的搜索路径:

(gdb) set solib-search-path /路径 (路径为.ko文件在目标机中的存储路径,不加文件名)

# insmod XX.ko 现在,可通过命令控制目标机: (gdb) b X X (可以设置一些断点)

(gdb) c (继续启动目标机, 直到出现shell命令提示符)

10, 常用gdb命令的使用 两台机器建立连接后, 可以在开发机上用gdb命令插入段点、打印变量的值、中断或继续执行程序等命令, 控制目标机上内核的运行。

A. 断点相关命令: break [linenum]/[func]: 在指定行或指定函数设置断点 clear [linenum]/[func]: 删除断点, 指定行号或函数名为参数 delete [breakpoint]/[range]: 删除断点, 参数是断点号, 或断点号的范围, 若无参数则删除所有断点. enable [breakpoint]/[range]: 激活断点, 参数同delete disable [breakpoint]/[range]: 禁止断点, 参数同delete info breakpoint/break : 显示当前断点的情况 B. 设置观察点: watch 为表达式(变量)expr设置一个观察点。 程序运行过程中,若表达式值有变化,则停住程序, 分别显示表达式变化前后的值.

C. 程序执行: c: 当程序被停住时, 使用c命令将继续执行程序,直到下一个断点. step: 单步执行, 遇到函数调用时进入函数内部 next: 单步执行, 函数调用当成一条语句 stepi : 单步机器指令, 同时显示机器指令和程序源代码. nexti: 单步机器指令, 同时显示机器指令和程序源代码. u: 退出循环 ctrl+c: 停止内核的运行, 退回到(gdb) kill: 杀死被调试内核程序的运行

D. 显示信息: (1). 打印变量的值print(简称p): p [/f] [变量名], 打印局部变量时, 程序必需执行到该变量所在函数内. p [$寄存器名], 打印寄存器的当前值, 分别用十六进制和十进制表示 其中参数f可以指定显示格式: x/d/u/o/t/a/c/f

x 表示按十六进制格式显示变量 d 按十进制格式显示变量 u 按十六进制格式显示无符号整型 o 按八进制格式显示变量 t 按二进制格式显示变量 a 按十六进制格式显示变量 c 按字符格式显示变量 f 按浮点数格式显示变量 (2). 修改变量: p [var=value] set [var=value] (3). 显示寄存器内容 info all-registers:显示所有寄存器内容 info registers: 显示寄存器内容,除浮点寄存器外 info registers [regname ...] 查看所指定的寄存器的情况 (4). 显示变量信息 info variables: 显示所有全局变量和静态变量 info locals: 显示当前函数中定义的所有局部变量, 只有程序进入函数内部时有效 (5). 查看内存命令examine (简写x) x [/n/f/u] [addr] 其中: n、f、u是可选的参数. n 是一个正整数,表示显示内存的长度; f 表示显示的格式,可选x/d/u/o/t/a/c/f, 含义同p命令; u 表示从当前地址往后请求的字节数,默认为1byte。可选项b/h/w/g, 其中:b表示单字节,h表示双字节,w表示四字节,g表示八字节。

E. 跟踪堆栈 backtrace(简称bt): bt : 打印当前函数调用栈的信息,跟踪函数调用情况 bt [n]: 打印栈顶前n条信息 bt [-n]: 打印栈底前n条信息 info frame 显示堆栈的详细信息

F. 查看源代码: list命令: list: 从当前行开始显示后10行代码 list - : 从当前行开始显示前10行代码 list [linenum]: 从第linenum行开始显示10行 list [function]: 显示指定函数的前10行 list [first], [last] : 显示first 到 last之间的源码

查看源代码的内存: info line [function]/[linenum]: 查看指定函数或指定行在内存中的起始地址 info address [函数/变量], 显示函数或变量地址 查看汇编指令: disassemble [function]: 查看函数源码对应的汇编指令.

G. 帮助命令help(简称h) h [command]

联系客服:779662525#qq.com(#替换为@)