【文章标题】: 使用 gdb 对程序进行汇编级调试(之一 gdb 简介)
【文章作者】: 范晨鹏
【作者邮箱】: p_168@163.com
【作者主页】: http://diylab.cnblogs.com
【作者QQ号】: 109427716
【下载地址】: 自己搜索下载
【作者声明】: 恭贺嵌入式版块的开张
--------------------------------------------------------------------------------
【详细过程】
  提笔首先恭贺嵌入式平台版块的开张! 增设嵌入式平台,不仅使学院交流的平台更加广阔,而且让人看到了学院的新气息。学院一直在向跟前时代向前走哇!
  
  早想为新版块做一些贡献,无奈才疏学浅,琢磨了一个星期也没想出能拿得出手的东东。看有人讨论说 嵌入式平台 gdb 颇有些用处,就整理了一下 gdb 调试手记。竟也凑出了几篇文章。愿能给大家一些帮助。
  闲言少叙,书归正传。
  我想写成一个专题。现在计划好三篇了。第一篇是 gdb 简介。第二篇是 gdb 命令介绍。主要是介绍 OllyDbg 的调试操作 在 gdb 中的对应的命令,以及 gdb 特色命令的介绍。第三篇是 实际用 gdb 使用实战。通过跟踪一个 bug 来演示的。
  其实第四篇也差不多了,是介绍 gdb 在 symbian 系统上的调试示例。
  卖完这些,我也就技穷了。欢迎大家拍砖。
  
  1、什么是gdb ?
  gdb 是一个开源的、应用于 linux/unix 平台下的 调试工具。全称是 gnu debug。( gnu 就不用解释了吧? ) 是一个 linux/unix平台下的源代码级的调试工具。其性能优良、功能齐备、易于使用,广受支持。
  目前的版本是 6.8, 2008年 3 月 发布的。 
  
  gdb 的官方网站 是 http://www.gnu.org/software/gdb/。
  学习 gdb 最权威的教材是 GDB User Manual 和 GDB Internals Manual。你可以在 其官方网站 下载到。http://www.gnu.org/software/gdb/documentation/
  
  1、为什么要使用 gdb。
  最朴实的理由:应用场合广泛。gdb的应用场合有多广泛呢?
  可以参考 gdb 的官方网站上一句牛X哄哄的话。GDB can run on most popular UNIX and Microsoft Windows variants.
  目前,多数的嵌入式开发工具和嵌入式平台都支持 gdb 作为调试工具。从强悍的 BDI,到廉价的 Wiggler,都支持 gdb 作为调试工具。而嵌入式的操作系统,linux平台, symbian平台,Android平台,也都对 gdb 有良好的支持。
  就其功能来说,它有如下的优点:
  
  1、良好的跨平台特性。
  2、支持远程调试( remote debug )
  3、支持指令级、函数级的控制,包括单步( step )、跳转( jump )、返回( return )等。支持对寄存器、的读写操作,支持条件断点,读、写断点,以及硬件断点。
  4、支持内核调试和应用程序级别的调试,支持源代码级的调试。支持对正在运行的进程的 attach和 deattach。
  5、对 c++特性的支持和 unix 特性的支持。例如,支持异常捕获、信号捕获。
  6、支持对多线程、多进程程序的控制。
  
  优点基本说全了吧?简单地概括就是:别的调试器有的功能,它有,别的调试器没有的功能,它也有。
  
    [BGCOLOR=#000000]今天起得太早了,脑子晕~~大家有想法的欢迎补充。 [/BGCOLOR]
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年03月16日 5:02:12

【文章标题】: 使用 gdb 对程序进行汇编级调试(之二 gdb 常用指令介绍)
【文章作者】: 范晨鹏
【作者邮箱】: p_168@163.com
【作者主页】: http://diylab.cnblogs.com
【作者QQ号】: 109427716
【作者声明】: 恭贺嵌入式版块的开张
--------------------------------------------------------------------------------
【详细过程】
  常用指令介绍
  

  开始/重新开始
  ( gdb) r     ( run )
  
  下断点
  (gdb) b *0x0804ce2b
   b 表示  break
  
  单步步过
  (gdb) ni    (next instruction)
  单步步入  
  (gdb) si    ( step instruction )
  继续执行
  ( gdb )c
  
  执行到返回
  (gdb) finish
  
  disas 
  
  反汇编一段指令。可以带零个、一个或两个参数。第一个参数是反汇编开始地址,第二个参数是反汇编结束地址。
  
  如果没有参数,则反汇编当前的函数。
  
  
  内存读/写断点
  watch *(int  *)0x8049aa4
  在 0x8049aa4 处下写断点,断点的范围为 4个字节。
  gdb支持更大范围的内存写断点。但在汇编条件下,我还没有找到设置更大内存写断点的方法。
  rwatch ,awatch 用法同 watch ,分别表示读断点和 读写断点。
  读写断点依赖于 gcc可用的硬件高度寄存器。
  
  
  
  寄存器窗口
  
  (gdb) display
  
  设定要观察的变量的内容。这些变量的值在程序每次被断下来后显示在屏幕上。
  
  例如,我们经常要关注  eax, ebx, ecx,edx的内容,则用 display 设置他们为观察变量。
  
  (gdb) display  /x $eax
  
  (gdb) display  /x $ebx
  
  (gdb) display  /x $ecx
  
  (gdb) display  /x $edx
  
  
  (gdb) until 
相当于 od  的 f4
  
  
  特色功能:
  1、设置反汇编代码使用的指令集
  (gdb) set disas intel
  
  设置反汇编代码使用的指令集,可选择 intel 指令集或 AT&T指令集.
  
  该指令只能用于x86平台。
  
  
  捕获 “段错误”的信号
  (gdb) handle SIGSEGV

  抛出异常时捕获
  (gdb) catch throw
  
  查看栈帧。
  (gdb) where
   
  强制返回
  (gdb) return 
  程序直接从当前行跳转到 return 处。如果函数有返回值,则加在 return 命令之后。例如, return 1。跳转中,栈平衡是自动维护的。
   
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年03月16日 5:27:12