gdb 对程序进行汇编级调试

Posted on 2010-04-03 10:32 T.S Liu 阅读(1622) 评论(1)  编辑 收藏 引用

使用 gdb 对程序进行汇编级调试

                                             转自http://www.cnblogs.com/diylab/archive/0001/01/01/1524483.html

开始/重新开始
  ( 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。跳转中,栈平衡是自动维护的。修改程序代码段:

By default, GDB opens the le containing your program's executable code (or the core le) read-only. This prevents accidental alterations to machine code; but it also prevents you from intentionally patching your program's binary. If you'd like to be able to patch the binary, you can specify that explicitly with the set write command. For example, you might want to turn on internal debugging ags, or even
to make emergency repairs.

set write on

exec-file

 

The dump and append commands write data to a file, and the restore command reads data from a file back into the inferior’s memory.

写内存:

To store values into arbitrary places in memory, use the `{...}' construct to generate a value of speci ed type at a speci ed address (see Section 8.1 [Expressions], page 63). For example, {int}0x83040 refers to memory location 0x83040 as an integer (which implies a certain size and representation in memory), and set {int}0x83040 = 4
stores the value 4 into that memory

 

 

参考资料:

 <debugging with gdb> by Richard Stallman, Roland Pesch etc, Published by the Free Software Foundation

 

Feedback

# re: gdb 对程序进行汇编级调试  回复  更多评论   

2012-03-24 23:12 by 叶剑飞
在gdb中设置反汇编代码使用的指令集,不能用set disas intel,否则会出现如下错误信息
Ambiguous set command "disas intel": disassemble-next-line, disassembly-flavor.

正确的方法应该用
set disassembly-flavor intel

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理