嵌入式开发基础_调试篇

上传人:子 文档编号:52128448 上传时间:2018-08-18 格式:PPT 页数:17 大小:66.50KB
返回 下载 相关 举报
嵌入式开发基础_调试篇_第1页
第1页 / 共17页
嵌入式开发基础_调试篇_第2页
第2页 / 共17页
嵌入式开发基础_调试篇_第3页
第3页 / 共17页
嵌入式开发基础_调试篇_第4页
第4页 / 共17页
嵌入式开发基础_调试篇_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《嵌入式开发基础_调试篇》由会员分享,可在线阅读,更多相关《嵌入式开发基础_调试篇(17页珍藏版)》请在金锄头文库上搜索。

1、主要内容1.常用的内存调试 memwatch yamd 2.gdb调试 3.kdb调试memwatch 下载memwatch-2.71.tar.gz tar zxvf memwatch-2.71.tar.gz cd memwatch-2.71 编写源代码(test.c) 增加 #include “memwatch.h” 编译 gcc -DMEMWATCH DMW_STDIO test.c memwatch.c o test 运行 ./test 查看memwatch.log文件Yet Another Malloc Debugger 下载yamd-0.32.tar.gz tar zxvf yamd

2、-0.32.tar.gz cd yamd-0.32 make make install 编写源代码(test.c) 编译 ./yamd-gcc -g o test test.c 运行 ./test 查看输出日志GDB 在编译时选择-g选项 gdb的启动 gdb program-name or gdb 启动后执行file program-name or gdb program-name corefile-name 常用命令:file list next step run quit watch break make shell print disable delete continueKDB 准备

3、工作 您将需要下载并应用两个补丁。一个是“公 共的”补丁,包含了对通用内核代码的更改 ,另一个是特定于体系结构的补丁。例如,在运行 2.6.6内核的 x86 机器上,您 会需要 kdb-v4.3-2.6.6-common-1.bz2 和 kdb-v4.3-2.6.6-i386-1.bz2 KDB 安装 bzip2 -d kdb-v4.3-2.6.6-common-1.bz2 bzip2 -d kdb-v4.3-2.6.6-i386-1.bz2 打补丁 patch -p1 /proc/sys/kernel/kdb (#echo “0“ /proc/sys/kernel/kdb) kdb=earl

4、y标志将导致在引导过程的初始阶 段就把控制权传递给 KDB。如果您需要在 引导过程初始阶段进行调试,那么这将有 所帮助。 启动: PAUSE键KDB 命令 内存显示和修改 这一类别中最常用的命令是 md 、 mdr 、 mm 和 mmW 。 md 命令以一个地址符号和行计数为参数,显示从该地 址开始的 line-count 行的内存。如果没有指定 line-count ,那么就使用环境变量所指定的缺省值。如果没有指定地 址,那么 md 就从上一次打印的地址继续。地址打印在开 头,字符转换打印在结尾。 mdr 命令带有地址符号以及字节计数,显示从指定的地 址开始的 byte-count 字节数的

5、初始内存内容。它本质上和 md 一样,但是它不显示起始地址并且不在结尾显示字符 转换。 mdr 命令较少使用。 mm 命令修改内存内容。它以地址符号和新内容作为参 数,用 new-contents 替换地址处的内容。 mmW 命令更改从地址开始的 W 个字节。请注意, mm 更改一个机器字。 KDB 命令 寄存器显示和修改 这一类别中的命令有 rd 、 rm 和 ef 。 rd 命令(不带任何参数)显示处理器寄存器的内容。它可 以有选择地带三个参数。如果传递了 c 参数,则 rd 显示 处理器的控制寄存器;如果带有 d 参数,那么它就显示调 试寄存器;如果带有 u 参数,则显示上一次进入内核的

6、当 前任务的寄存器组。 rm 命令修改寄存器的内容。它以寄存器名称和 new- contents 作为参数,用 new-contents 修改寄存器。寄存 器名称与特定的体系结构有关。目前,不能修改控制寄存 器。 ef 命令以一个地址作为参数,它显示指定地址处的异常帧 。 显示通用寄存器组: rdKDB 命令 断点 常用的断点命令有 bp 、 bc 、 bd 、 be 和 bl 。 bp 命令以一个地址符号作为参数,它在地址处应用断 点。当遇到该断点时则停止执行并将控制权交予 KDB。 该命令有几个有用的变体。 bpa 命令对 SMP 系统中的所 有处理器应用断点。 bph 命令强制在支持硬件

7、寄存器的系 统上使用它。 bpha 命令类似于 bpa 命令,差别在于它强 制使用硬件寄存器。 bd 命令禁用特殊断点。它接收断点号作为参数。该命令 不是从断点表中除去断点,而只是禁用它。断点号从 0 开 始,根据可用性顺序分配给断点。 be 命令启用断点。该命令的参数也是断点号。 bl 命令列出当前的断点集。它包含了启用的和禁用的断点 。 bc 命令从断点表中除去断点。它以具体的断点号或 * 作 为参数,在后一种情况下它将除去所有断点。KDB 命令堆栈跟踪 主要的堆栈跟踪命令有 bt 、 btp 、 btc 和 bta 。 bt 命令设法提供有关当前线程的堆栈的信息。它可以有选择地将堆栈 帧

8、地址作为参数。如果没有提供地址,那么它采用当前寄存器来回溯 堆栈。否则,它假定所提供的地址是有效的堆栈帧起始地址并设法进 行回溯。如果内核编译期间设置了 CONFIG_FRAME_POINTER 选项 ,那么就用帧指针寄存器来维护堆栈,从而就可以正确地执行堆栈回 溯。如果没有设置 CONFIG_FRAME_POINTER ,那么 bt 命令可能 会产生错误的结果。 btp 命令将进程标识作为参数,并对这个特定进程进行堆栈回溯。 btc 命令对每个活动 CPU 上正在运行的进程执行堆栈回溯。它从第一 个活动 CPU 开始执行 bt ,然后切换到下一个活动 CPU,以此类推。 bta 命令对处于某

9、种特定状态的所有进程执行回溯。若不带任何参数 ,它就对所有进程执行回溯。可以有选择地将各种参数传递给该命令 。将根据参数处理处于特定状态的进程。选项以及相应的状态如下: D:不可中断状态。 R:正运。 S:可中断休眠。T:已跟踪或已停止 Z:僵死。 U:不可运行。 这类命令中的每一个都会打印出一大堆信 息。KDB 命令下面是在内核调试过程中非常有用的其它几个 KDB 命令。 id 命令以一个地址符号作为参数,它对从该地址开始的指令进行反 汇编。环境变量 IDCOUNT 确定要显示多少行输出。 ss 命令单步执行指令然后将控制返回给 KDB。该指令的一个变体是 ssb ,它执行从当前指令指针地址

10、开始的指令(在屏幕上打印指令) ,直到它遇到将引起分支转移的指令为止。分支转移指令的典型示例 有 call 、 return 和 jump 。 go 命令让系统继续正常执行。一直执行到遇到断点为止(如果已应 用了一个断点的话)。 reboot 命令立刻重新引导系统。它并没有彻底关闭系统,因此结果是 不可预测的。 ll 命令以地址、偏移量和另一个 KDB 命令作为参数。它对链表中的 每个元素反复执行作为参数的这个命令。所执行的命令以列表中当前 元素的地址作为参数。 KDB 命令举例 假设我们的程序源文件名为getpid.c,内容是: #include #include #include #inc

11、lude int main(void) long ID; ID = getpid(); printf (“getpid()=%ldn“, ID); return(0); KDB 命令举例 将其编译成名为getpid的执行文件”gcc o getpid /getpid.c”, 我们使用KDB来产看它进入内核后的执行路 径。 激活KDB (按下pause键,当然你必须已经给内核打了 KDB补丁);设置内核断点 “bp sys_getpid” ;退出kdb “go”; 然后执行./getpid 。瞬间,进入内核调试状态,执行路径停 止在断点sys_getpid处。 在KDB提示符下,执行bt命令观察堆栈,发现调用的嵌 套路径,可以看到在sys_getpid是在内核函数system_call 中被嵌套调用的。 在KDB提示符下,执行rd命令查看寄存器中的数值,可 以看到eax中存放的getpid调用号0x00000014(=20). 在KDB提示符下,执行ssb(或ss)命令跟踪内核代码执 行路径,可以发现sys_getpid执行后,会返回system_call 函数,然后接者转入ret_from_sys_call例程。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号