• GDB常用命令


    启动和停止:

      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调试调试程序》

  • 相关阅读:
    设置一个alias直接推到github
    JSON
    分部式类定义
    sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
    ibatis 连接数据库时的错误
    ibatis 连接数据库
    [ASP.NET] C#字符串处理
    20130401学习笔记
    最大公约数和最小公倍数
    从客户端中检测到有潜在危险的 Request.Form 值 解决方案
  • 原文地址:https://www.cnblogs.com/vincently/p/4812127.html
Copyright © 2020-2023  润新知