DDD 2010年11月18日 星期四 14:26 | 3157次浏览 | 0条评论
the watchpoint of kgdb 大致流程为:
A:using gdb to set a watch
B
C:kgdb receive/parse the protocol packet
D:kgdb set a watchpoint hardware breakpoint on kernel
E:Once kernel hit a watchpoint breakpoint, kgdb will collect the watchpoint breakpoint
info, fill them to a Stop-Reply-Packets with watchpoint format, and send out to gdb
前面我们在《
gdb 和 watchpoint
》 文章
里讨论了在gdb的watchpoint,这次我们来讨论下如何让kgdb也支持watchpoint特性。
KGDB 相当于一个gdb server,只是这个server是跑在内核里面。所以KGDB支持watchpoint实现和
gdb server的实现如出一辙,即通过
GDB远程串行协议
里的Stop-Reply-Packets来传达
watchpoint信息给gdb,让gdb知道那个watchpoint击中了。
其运行的大致流程为:
A:using gdb to set a watchpoint
|
在gdb敲入watch命令后,会将发送一个设置watchpoint的数据包给kgdb,kgdb收该数据包后就执行设置断点动作.
(gdb) watch xxx (假设我们要监视断点地址为 xxx)
|
watchpoint 断点隶属于硬件断点,所以我们先来谈谈硬件断点的触发的整个流程和细节。
硬件断点的触发后,会产生一个调试异常
,
因此会进入do_debug异常的
|
如果kgdb处于早期调试模式(那时候Hardware Breakpoint Layer还没初始化),则是由kgdb自己处理
DIE_DEBUG的notify通知,如果是普通模式,即硬件断点管理都是从Hardware Breakpoint Layer获取的,
则是由Hardware Breakpoint Layer处理,然后通过回调函数kgdb_hw_overflow_handler()进入kgdb.
Hardware Breakpoint Layer处理流程
:
|
kgdb只需要知道是哪个watchpoint断点被踩中了,并把它的地址传递给gdb就可以了。
如果kgdb处于早期调试模式,则可以挨个判断dr6寄存器值的bit位来看哪个watchpoint击中了。
但是普通模式的Hardware Breakpoint Layer回调函数并没有传递dr6值给我们,不过还好,它传
递struct perf_event的event对象给我们,通过这个对象,我们可以得到发生硬断点的地址,然后
根据地址和kgdb里保存的硬断点数组对比,相同的,则是踩中的断点..
static
void
kgdb_hw_overflow_handler
(
struct
perf_event
*
event
,
int
nmi
,
|
在得到是哪个breakinfo[i]被触发后,在查看下breakinfo[i].type,如果是
X86_BREAKPOINT_WRITE/X86_BREAKPOINT_RW 就可以认定是watchpoint断点了,
而断点地址则保存在breakinfo[i].addr.
4: 填充Stop-Reply-Packets来通知gdb踩中watchpoint断点了
根据watchpoint断点的类型,返回给gdb的Stop-Reply-Packets可以有如下格式:
type
=
breakinfo
[
i
]
.
type
;
|
具体packgets包格式,可以阅读 Stop-Reply-Packets
After gdb connect successly to kgdb
,
setting a watchpoint
|
更多有关kgdb和Hardware Breakpoint Layer的内容,可阅读:《
抓虫日记之 kgdb 和 删除硬断点
》
更多有关x86硬件调试寄存器信息,可阅读:《
x86 调试寄存器
》
本文转载自:
http://www.kgdb.info/kgdb/kgdb_watchpoint_support_on_x86/
Zeuux © 2025
京ICP备05028076号
暂时没有评论