GDB常用命令

本秂侑毒 提交于 2019-12-25 06:41:03

启动和停止:

  gdb <gropram>  //使用gdb调试program可执行文件,注意在编译时gcc要加入-g参数。

  gdb <program> core //用 gdb 同时调试一个运行程序和 core 文件,core 是程序异常终止后 core dump 后产生的文件。

  gdb <program> <PID>  //如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程 ID。gdb 会自动attach 上去,并调试他。program 应该在 PATH 环境变量中搜索得到。

  run或r  //运行程序(在此给出命令行参数)

  kill  //停止程序

 

显示代码:

  list==l

  list<linenum>  //显示程序第linenum行周围的程序

  list<functiont>  //显示函数名为function的函数的源程序

  list  //显示当前行后面的源程序

  list-  //显示当前行前面的源程序

 

断点:

  break == b

  break <function>   //在函数function入口处设置断点

  break <linenum>  //在指定行号停住

  break *addreee  //在地址address处停止

  break <linespc> thread <threadno>  //linespc指定了断点在源程序的行号。threadno指定了线程ID。注意,这个ID是线程ID是GDB分配的,你可以通过“info threads"命令查看正在运行中的线程信息。如果不指定thread<threadno>则表示你的断点设在所有线程上面。

  info break[n]或info breakpoints[n]  //查看断点信息, n表示断点号。如果不加n表示查看所有断点信息。

  delete[breakpoints][range]       //删除指定的断点,breakpoints为断点号,如果不指定断点号,则表示删除所有的断点。range表示断点号的范围(如:3-7)。其简写命令为d。

 

恢复程序运行和单步调试:

  step<count>或s<count>  //单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有 debug 信息。很像 VC 等工具中的 step in。后面可以加 count 也可以不加,不加表示一条条地执行,加表示执行后面的 count 条指令,然后再停住。

  next<count>或n<count>  //同样单步跟踪,如果有函数调用,他不会进入该函数。很像 VC 等工具中的 step over。后面可以加 count 也可以不加,不加表示一条条地执行,加表示执行后面的 count 条指令,然后再停住。  

  finish  //运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。

    until 或 u  //当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

 

输出:

  print == p

  print $eax  //以十进制输出%eax的内容

  print  /x <variable>  //以十六进制输出variable的内容

  print  /t <variable>  //以二进制输出variable的内容

  print  /o <variable>  //以八进制方式输出变量variable内容

  print  /c <variable>  //按字符格式显示variable

  print  /f <variable>  //按浮点数格式显示variable

  print 0x100  //输出0x100的十进制表示

  print /x ($ebp + 8)  //以十六进制输出%ebpd 内容加上8

  print *(int*) 0xfff076b0  //输出位于地址0xfff076b0

  print *(int*) ($ebp+8)  //输出位于地址%ebp+8处的整数

  x/2w 0xfff0760b0  //检查从地址0xfff076b0开始的双字

  x/20b sum  //检查函数sum的前20个字节

  p *a@len  //数组的全部元素,a是数组名,len是数组元素的个数。如果是静态数组的话,可以直接用 print 数组名,就可以显示数组中所有数据的内容了。

   

检查代码

  disas  //反汇编当前函数

  disas sum  //反汇编函数sum 

  disas 0x8048397  //反汇编位于地址0x8048397附近的函数

  disas 0x8048394 0x80483a4  //反汇编指定地址范围内的代码

 

查看堆栈信息:

  backtrace或bt  //查看函数堆栈 

  backtrace<n>或bt<n>  //n是一个正整数,表示只打印栈顶上n层的栈信息;-n表示一个负整数,表示只打印栈底下n层

  frame或f  //打印当前栈层的信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句

  frame<n>或f<n>  //n 是一个从 0 开始的整数,是栈中的层编号。比如:frame 0,表示最上一层,frame 1,表示栈的第二层;打印的信息和frame相同

 

  info args  //打印当前函数的参数名及其值

  info locals  //打印当前函数所有局部变量及其值

  info catch  // 打印出当前的函数中的异常处理信息

 

多线程:

  info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有的是当前调试的线程。

  thread ID 切换当前调试的线程为指定ID的线程。

  thread apply all command 让所有被调试线程执行GDB命令command。

 

参考资料:

  1. 《深入理解计算机系统》(第二版)  机械工业出版社  P175

  2. 《用GDB调试调试程序》

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!