1. GDB调试
1.1 断点
b/break + 函数名
b/break + 文件名:行号
delete breakpoints 2 : 删除断点
disable/enable breakpoints 3 : 禁用/启用断点
break 9 if sum != 0 : 满足条件激活断点
1.2 显示信息
i/info 显示信息
i breakpoints : 显示断点
i registers : 显示寄存器的当前值
i thread : 查看当前程序中的线程(info thread)
线程信息列名显示如下:
序号 线程ID 线程名 当前所在的指令地址或函数 当前所在的指令地址对应的c代码
List/l : 列出源码
Disassemble : 反汇编当前函数或指定函数
1.3 设置线程
设置当前操作的线程: thread tnum
针对指定线程使用命令:thread apply tnum cmd
查看指定线程调用栈: thread apply tnum bt
1.4 调试步骤
r/run : 重新从程序开头连续运行
c/continue: 程序继续
s : 单步调试,进入函数(F11)
finish : 退出函数
N: 单步调试, 不进入函数(F10)
Bt : 查看函数调用堆栈
Quit : 退出gdb
1.5 变量值
p/print + 变量: 打印变量
set var sum = 0 : 修改变量值
修改变量的值:set variable = val
修改内存的值:set *(type *)address = val , print (type)address=val
修改寄存器的值:set regname = val
查看内存值:x [/nfu] address
N 指定要打印的内容的个数
F 指定按照何种格式打印
U 指定每个内容的长度 包括: byte halfword word giant(8bytes)
查看结构体的大小: print sizeof(stuctrue)
查看结构体中成员的偏移:print &((struct*)0x0)->member
显示当前的指令:display /I $pc
设置结构体变量显示格式:set print pretty
程序被断点中断时执行自定义的操作:
Commands [bnum]
…..command-list….
End
为断点设置条件:condition bnum expression
1.6 gdb 调试进程
gdb attach pid
断开gdb连接:Disconnect
断开gdb连接并让程序正常运行:detach
调试子进程时需要set follow-fork-mode child
切换为父进程时: set follow-fork-mode parent
1.7 调试CORE文件
Gdb excuteFileName coreFile
1.8 gdb ko
gunzip vsr100x_x86_64.ko
gdb ****.ko
list *Fwd_Data(函数名) + 0x3c1 查看c代码行数
p sizeof(struct) 查看结构体大小
p 变量 查看值
1.9 调用函数
设置出参:
例如:定义并初始化出参:set $outVar1 = (char*)malloc(256)
调用函数: call func1(inVar1,inVar2,$outVar1)
查看调用后返回的出参 print $outVar1
2. KDB调试
2.1 kdb环境准备
release 版本需要加载devkit包
bash里查看kdb开关,1表示打开:cat /proc/sys/kernel/kdb
将kdb打开或关闭:
Echo “1” > /proc/sys/kernel/kdb
Echo “0” > /proc/sys/kernel/kdb
Debug版本不需要做这些动作
按键盘上的 Pause Break键可进入kdb
2.2 CPU切换
CPU 查看cpu信息
Cpu 1 切换到cpu1,每个cpu有不同的运行栈
2.3 kdb 断点设置
Bp 函数名 设置断点
Bp/bl 查看所有断点( break point/ break list)
Bp #0 查看第0个断点
Bc 0 清除第0个断点
Bc * 清楚所有断点
Bd 0/* 使第0个/所有断点无效
Be 0/* 激活第0个/所有断点
? 查看更多命令
Go 继续运行
Ss : 单步执行程序:仅仅执行下一条指令,执行完后停止
Ssb: 执行到分支或者函数调用时停止:与ss的区别是ss只执行一条语句,ssb执行一组语句,它使指令继续执行,在遇到一个分支语句或者函数调用语句时停止。
查看调用栈(命中断点后):
Bt : 查看该CPU上调用栈关系(代码中添加dump_stack可打印调用栈,类似与bt效果)
Bta: 查看所有CPU上调用栈关系
Btp pid : 查看进程的调用栈关系
反汇编: ld函数名 , id翻页
函数入参的观察办法:
Bt通常会打印出入参
通过rd命令查看寄存器,参数顺序如下:
Ax dx cx bx --- x86 32
Rdi rsi rcx r8 r9 -----x86 64 其他的保存在堆栈上
Rax 作为返回值
内存信息观察,内存修改:
查看变量的内存地址 md g_ulDrvFwdPolicy (memory display)
修改内存地址mm g_ulDrvFwdPlicy xxx ( memory modify)
解析函数指针数组 mds g_apfCheckFunc
2.4 异常信息观察
可查看printk 打印的消息
Dmesg 10 打印最近10行
Dmesg
硬件断点(虚拟机上不支持)
Bph [vaddr [datar | dataw | io [length]]]
Bph g_ulDrvFwdPolicy dataw
进入KDB控制台时,会打印进入KDB的原因,及基础信息,格式一般如下:
Entering kdb (current=0Xaddr , pid PID)on processor CPU due to REASON
网友评论