中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 操作系统 > Linux > Linux综合
使用GDB与QEMU调试内核时的问题分析
作者:mingyanguo 时间:2006-07-27 19:57 出处:www.chinaunix.net 责编:LOKI
              摘要:暂无
使用QEMU+GDB能够实现源代码级的内核调试,但是,存在一个问
题──当内核允许中断时,单步命令(n与s)会进入时钟中断。通过
浏览QEMU的源代码,大体把原因找了出来。 单步命令(n与s)在
gdb远程调试通讯协议中是s(参看info gdb),qemu的gdb stub
在受到s命令后将虚拟CPU进入单步状态,但是在接收到s命令前,
qemu的虚拟CPU是停止的(在等待gdb的命令),注意,这个时
候,虚拟时钟计时并没有停止,所以,很可能在qemu的虚拟CPU还
没开始的时候就需要触发时钟中断了,但是虚拟CPU还在停止状态,
中断无法触发。接收到s命令后,虚拟CPU开始执行指令。这时,如
果内核允许中断,虚拟时钟就将触发中断,所以s命令执行一条指令
后停止在时钟中断处理程序的开始处,而不是希望的函数中下一条指
令处。

  现在看一下问题的解决方法。在我看来,需要修改gdb远程调试内核
时单步命令的语义。有两个方向。
1.在gdb上修改。在处理用户的n与s命令时不是发送协议中的s命令,
而是分两步。首先确定下一条指令的开始位置(或者下一行源程序对应
的指令的开始位置)。对于有些RISC机器机器指令固定为某个长度,那
么确定这个位置比较简单,但是对于像x86这样的变长指令的体系结构
就需要稍微麻烦一点(需要确定当前指令的长度等)。然后假如第一步
确定的地址是naddr。现在像处理用户的tbreak *naddr一样处理就可
以了,接着发送继续运行命令c就可以了。
2.在qemu的gdb stub上修改协议命令s的处理方法。接收到s命令后
不是让虚拟CPU进入单步执行状态,而是确定在没有中断的情况下,下
一条指令的位置(注意对于当前是跳转指令的情况处理比较复杂),然
后在这个位置设置临时断点,在虚拟CPU到达这个断点进入gdb stub
 后立即将其取消。

这两种处理方法中,我认为1比较好,实现起来清晰明了,但是需要对
gdb的代码比较熟悉。2方法比较复杂,尤其是在当前指令是跳转指令
时,不太容易确定临时断点的位置。

另外作为暂时的权宜之计,我们可以只使用tbreak +offset来代替n
与s命令。
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有