GDB汇编调试指令合集

设置断点

命令:break/b
功能:在程序特定“位置”设置断点,当执行到断点处调试器会暂停程序的执行。
格式:

  • break function 函数入口处(第一行可执行代码)设置断点。
  • break line_number 当前活动源代码文件的line_number处设置断点。
  • break filename:line_number 在源代码文件filename的line_number处设置断点。
  • break filename:function 在源代码文件filename的function函数入口处设置断点。注意多个重载函数会同时添加断点。
  • break *address 在虚拟内存地址处设置断点。

删除断点

命令:delete/clear
功能:delete可删除单个断点,也可以删除一个断点集合。Clear删除所选定的环境中所有的断点。
格式:

  • delete [breakpoints num][range…] 删除断点集合。
  • clear function 删除函数的所有断点。
  • clear filename:functin 删除源代码文件filename的funtion函数的所有断点。
  • clear line_number 删除行号line_number上的所有断点。
  • clear filename:line_number 删除源代码文件filename的line_number行的所有断点。

禁用断点

命令:disable
功能:禁用某个断点的有效性,和删除断点时有却别的。
格式:disable breakpoints_list

设置监视点

命令:watch
功能:对变量添加监视点,当变量值变化时,GDB会暂停执行。需要注意变量的作用域,当超过变量的作用域时,该变量上设置的监视点会失效。
格式:

  • watch z 在变量z上设置监视点。
  • watch (z > 28) 在变量z上设置条件监视点,当变量z的值大于28时暂停。

C模式下单步执行

命令:next/step 或 n/s
功能:在调试C代码时,单步执行一行C代码。当使用step单步调试时,遇到函数调用时会进入被调用函数继续单步执行;当使用next时,遇到函数调用时不进入被调用函数而是直接执行该函数,然后继续从函数调用位置的下一行代码单步执行。
格式:next/step
示例:
当前将要执行函数mPrint调用:
这里写图片描述

  • next
    执行next命令:
    这里写图片描述
  • step
    执行step命令:
    这里写图片描述

恢复执行

命令:continue/cont/c
功能:恢复执行,直到遇到下一个断点。
格式:c

恢复执行到函数结尾

命令:finish/fin
功能:指示GDB恢复执行,知道恰好在当前栈帧完成之后为止。
格式:finish

恢复执行到循环结束

命令:until
功能:指示GDB执行循环的剩余部分,执行到循环后面的第一行代码位置处再暂停。
格式:until

查看调用栈

命令:

  • backtrace/bt
  • up
  • down

功能:bt 用来显示完整的调用栈。up显示调用栈的上一个父帧。down显示调用栈的下一个子帧。

Info line

命令:info line;
功能:查看某个line的相关信息;
格式:info line 函数名/*内存地址;
示例:

  • 如果参数为函数名,则显示该函数在源文件中的行号及在内存中的起始地址和结束地址。例如:
    这里写图片描述
  • 如果参数为*内存地址,则显示该内存地址的指令对应的语句所在的函数在源文件中的行号及在内存中的起始地址和结束地址。例如:
    这里写图片描述

查看内存

命令:x
功能:查看内存地址信息。其中参数n、f、u的含义如下:

  • n表示要显示的内存单元的个数。
  • f表示显示方式, 可取如下值:
    • x 按十六进制格式显示变量;
    • d 按十进制格式显示变量;
    • u 按十进制格式显示无符号整型;
    • o 按八进制格式显示变量;
    • t 按二进制格式显示变量;
    • a按十六进制格式显示变量;
    • i 指令地址格式;
    • c 按字符格式显示变量;
    • s 按字符串格式显示变量;
    • f 按浮点数格式显示变量。
  • u表示一个地址单元的长度,其中:
    • b表示单字节;
    • h表示双字节;
    • w表示四字节;
    • g表示八字节。

格式:x /nfu 内存地址
示例:f和u位置可以互换,当不指定u时默认是4字节(w)。

这里写图片描述

自动显示

命令:display
功能:设置一些自动显示的变量、地址或表达式,当程序停住时,或是在你单步跟踪时,会自动显示。display expr 自动显示表达式,display/fmt expr 指定输出格式(参考查看内存命令)来显示表达式,display/fmt addr 指定输出格式(参考查看内存命令)显示地址。
格式:display expr / display/fmt expr / display/fmt addr

查看变量

命令:print/p
功能:查看变量的值,如果需要查看变量的地址,可以使用p &变量名。其中变量值的输出格式可以参照【查看内存】命令的“f”参数的含义。
格式:p/f 变量名 或者 p & 变量地址
示例:
这里写图片描述

查看变量类型

命令:ptype/pt
功能:查看变量的类型,如果变量类型是结构体则会提供结构体的定义。
格式:pt var
示例:
这里写图片描述

查看寄存器

命令:info registers / info all-registers/i r /i r a
功能:查看寄存器的值,其中info registers/ i r查看指定寄存器,info all-registers/ i r a查看所有寄存器的值。
格式:i r 寄存器
示例:
这里写图片描述

注意:处理查看寄存器的命令 “i r”外,其他一些命令也可以查看或使用寄存器的值,比如“x”查看内存和“print”格式化输出都可以使用寄存器,但需要在寄存器前面加上“$”符号。例如:
这里写图片描述

反汇编

命令:disas/disass/disassemble;
功能:将内存中的机器码程序以指令助记符的形式显示出来;disas的参数有四种情况:

  • 不带参数。显示当前正在执行的函数的汇编代码。
  • 一个参数:地址。显示该地址所在的函数的汇编代码。
  • 两个参数:disas起始地址,结束地址 。显示[起始地址,结束地址]地址段的汇编代码。
  • 两个参数:disas 起始地址,+offset。显示[起始地址,起始地址+ offset]地址段的汇编代码。

格式:disas/disass/disassemble 函数名/起始地址[,结束地址];

汇编模式下单步执行

命令:ni/si
功能:在调试汇编代码时,单步执行一条汇编指令。当使用si单步调试时,遇到函数调用会进入被调用函数继续单步执行;当使用ni时,遇到函数调用时不进入被调用函数而是直接执行该函数调用,然后继续从函数调用的下一条汇编指令继续单步执行。
格式:ni/si
示例:
当前将要执行函数mPrint调用:
这里写图片描述

  • ni
    执行ni命令:
    这里写图片描述
  • si
    执行si命令:
    这里写图片描述

显示调试窗口

命令:layout asm / layout src / layout split / layout regs
功能:在调试代码时,layout asm显示汇编代码调试窗口,layout src显示C代码调试窗口,使用layout src、layout asm和layout split 同时显示C代码和汇编代码窗口。layout regs显示寄存器窗口。可以通过:

  • layout next:显示下一个layout。
  • layout prev:显示上一个layout
  • Ctrl + L:刷新窗口。
  • Ctrl + x,再按1:单窗口模式,显示一个窗口。
  • Ctrl + x,再按2:双窗口模式,显示两个窗口。
  • Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。

如果当前已经通过layout split同时显示汇编和C调试窗口,layout regs会替换当前聚焦的窗口(可以简单理解为最上方的窗口)。

格式:layout asm / layout src / layout split / layout regs
示例:

  • layout asm
    这里写图片描述
  • layout src
    这里写图片描述
  • layout asm 、layout src 和 layout split
    这里写图片描述

  • layout regs
    这里写图片描述

    开启调试窗口后,调试进程会有明显的卡顿。


  • 15
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值