办公桌厂家
免费服务热线

Free service

hotline

010-00000000
办公桌厂家
热门搜索:
行业资讯
当前位置:首页 > 行业资讯

Linux内核调试器内幕2

发布时间:2020-07-21 19:24:04 阅读: 来源:办公桌厂家

我们可以看到 rmqueue() 被 __alloc_pages 调用,后者接下来又被 _alloc_pages 调用,以此类推。 每一帧的第一个双字(double word)指向下一帧,这后面紧跟着调用函数的地址。因此,跟踪堆栈就变成一件轻松的工作了。 go 命令可以有选择地以一个地址作为参数。如果您想在某个特定地址处继续执行,则可以提供该地址作为参数。另一个办法是使用 rm 命令修改指令指针寄存器,然后只要输入 go。如果您想跳过似乎会引起问题的某个特定指令或一组指令,这就会很有用。但是,请注意,该指令使用不慎会造成严重的问题,系统可能会严重崩溃。 您可以利用一个名为 defcmd 的有用命令来定义自己的命令集。例如,每当遇到断点时,您可能希望能同时检查某个特殊变量、检查某些寄存器的内容并转储堆栈。通常,您必须要输入一系列命令,以便能同时执行所有这些工作。defcmd 允许您定义自己的命令,该命令可以包含一个或多个预定义的 KDB 命令。然后只需要用一个命令就可以完成所有这三项工作。其语法如下: [code:1:6ddc15f4ad][0]kdb> defcmd name usage help [0]kdb> [defcmd] type the commands here [0]kdb> [defcmd] endefcmd [/code:1:6ddc15f4ad] 例如,可以定义一个(简单的)新命令 hari,它显示从地址 0xc000000 开始的一行内存、显示寄存器的内容并转储堆栈: [code:1:6ddc15f4ad][0]kdb> defcmd hari no arguments needed [0]kdb> [defcmd] md 0xc000000 1 [0]kdb> [defcmd] rd [0]kdb> [defcmd] md %ebp 1 [0]kdb> [defcmd] endefcmd [/code:1:6ddc15f4ad] 该命令的输出会是: [code:1:6ddc15f4ad][0]kdb> hari [hari]kdb> md 0xc000000 1 0xc000000 00000001 f000e816 f000e2c3 f000e816 [hari]kdb> rd eax = 0x00000000 ebx = 0xc0105330 ecx = 0xc0466000 edx = 0xc0466000 .... ... [hari]kdb> md %ebp 1 0xc0467fbc c0467fd0 c01053d2 00000002 000a0200 [0]kdb> [/code:1:6ddc15f4ad] 可以使用 bph 和 bpha 命令(假如体系结构支持使用硬件寄存器)来应用读写断点。这意味着每当从某个特定地址读取数据或将数据写入该地址时,我们都可以对此进行控制。当调试数据/内存毁坏问题时这可能会极其方便,在这种情况中您可以用它来识别毁坏的代码/进程。 示例 [code:1:6ddc15f4ad]每当将四个字节写入地址 0xc0204060 时就进入内核调试器: [0]kdb> bph 0xc0204060 dataw 4 在读取从 0xc000000 开始的至少两个字节的数据时进入内核调试器: [0]kdb> bph 0xc000000 datar 2[/code:1:6ddc15f4ad] [size=18:6ddc15f4ad]结束语[/size:6ddc15f4ad] 对于执行内核调试,KDB 是一个方便的且功能强大的工具。它提供了各种选项,并且使我们能够分析内存内容和数据结构。最妙的是,它不需要用另一台机器来执行调试。

郑州吸脂价格

南昌热玛吉价格

长沙隆鼻医院

武汉面部填充医院

相关阅读