zoukankan      html  css  js  c++  java
  • GDB常用调试命令(一)

      GDB是UNIX及UNIX-like下的调试工具,通常gdb使用前置条件:编译时加入debug信息,这里指的是C++。

      gcc/g++调试选项

         gcc/g++是在编译时加入-g,-g分4个等级:

      1. -g0等于不加-g;即不包含任何信息
      2. -g1只包含最小信息,一般来说只有你不需要debug,只需要backtrace信息,并且真的很在意程序大小,或者有其他保密/特殊需求时才会使用-g1
      3. –g2为gdb默认等级,包含绝大多数你需要的信息
      4. –g3包含一些额外信息,例如包含宏定义信息

      关于gcc/g++优化级别,总结如下:

        gcc/g++ -O选项,gcc编译C,g++编译C++,-O分4个等级:

      1.  -O0编译不优化,如果指定了多个-o选项,不管带不带数字,最后一个选项才是生效的选项
      2.  -O1是最基本的优化等级。编译器会在不花费太多编译时间的同时试图生成更快更小的代码。这些优化是非常基础的,但一般这些任务肯定能顺利完成
      3.  -O2是推荐的优化等级,除非你有特殊的需求。-O2会比-O1启用多一些标记。设置了-O2后,编译器会试图提高代码性能而不会增大体积和大量占用的编译时间
      4.  -O3是最高最危险的优化等级。用这个选项会延长编译代码的时间,并且在使用gcc4.x的系统里不应全局启用。自从3.x版本以来gcc的行为已经有了极大地改变。在3.x,-O3生成的代码也只是比-O2快一点点而已,而gcc4.x中还未必更快。用-O3来编译所有的软件包将产生更大体积更耗内存的二进制文件,大大增加编译失败的机会或不可预知的程序行为(包括错误)。这样做将得不偿失,记住过犹不及。在gcc 4.x.中使用-O3是不推荐的
      5.  -Os这个等级用来优化代码尺寸。其中启用了-O2中不会增加磁盘空间占用的代码生成选项。这对于磁盘空间极其紧张或者CPU缓存较小的机器非常有用。但也可能产生些许问题,因此软件树中的大部分ebuild都过滤掉这个等级的优化。使用-Os是不推荐的

      GDB常用操作

      • 调试程序,gdb启动程序

          1.gdb 程序名,进入gdb后,使用run/r命令运行gdb调试,如果程序需要传递参数,run后面加[arg];

          2.如果程序需要传递参数,gdb --args 程序名 [arg],进入gdb后,使用run/r;

          3. 进入gdb后,输入程序名;如果需要给程序传递参数,使用set args  ["input"] 设定程序参数,再运行run/r,启动程序;

      • 调试正在运行的程序

          gdb attach [pid]

      • 查看源码

          list:list(l)  [函数名][行数],查看源码,简写l

      • 断点设置及管理

          break/b line_number :

            在line_number行上打断点,使程序在line_number行执行前停止

          break/b [filename]function_name:

            在filename文件下的function_name函数入口停止

           break/b [filename]line_number:

            在filename文件下的line_number行打断点

          break/b +offset/-offset :

            在当前行号的前面或后面offset停止

          break/b  where if condition :

            当某个条件满足时,在某一行停止; eg:在循环体中可以设置break ... if i = 100 来设置循环次数

           break/b :

            没有参数在下一行停止

          break/b  [内存地址] :

            在程序的运行地址处停止

          info break:

            显示当前的断点信息

             delete/d breakpoint_id:

            关闭断点

          disable/enable breakpoint_id:

            禁用/使能断点,该命令将禁止、允许断点 1,同时断点信息的 (Enb)域将变为 n、y

      • 运行命令

          run/r  [args] :run命令可以直接接命令行参数值

          set args ["input"]: 修改发送给程序的参数(进入GDB后才能使用)

          show args:查看其缺省参数的列表(进入GDB后才能使用)

      •  单步命令 

          next/n不进入的单步执行

          step/s进入的额单步执行

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

          until :退出当前的循环体

      • 查看信息

          1.查看数据

            print  variable : 查看变量

            print  *array@len :查看数组(array是数组指针,len是需要数据长度)

            可以通过添加参数来设置输出格式:
                      /x 按十六进制格式显示变量
                      /d 按十进制格式显示变量
                      /u 按十六进制格式显示无符号整型
                      /o 按八进制格式显示变量
                      /t 按二进制格式显示变量
                      /a 按十六进制格式显示变量
                      /c 按字符格式显示变量
                      /f 按浮点数格式显示变量

          2.查看内存

             examine /n f u + 内存地址(指针变量)
                    n 表示显示内存长度
                    f 表示输出格式(见上)
                    u 表示字节数制定(b 单字节;h 双字节;w 四字节;g 八字节;默认为四字节)

              如:
                        x /10cw pFilePath  (pFilePath为一个字符串指针,指针占4字节)
                        x 为examine命令的简写。

          3.查看栈信息

              backtrace [-n][n],简写bt
                    n  表示只打印栈顶上n层的栈信息
                    -n 表示只打印栈底上n层的栈信息
                    不加参数,表示打印所有栈信息

      • 搜索

          search text:该命令可显示在当前文件中包含text串的下一行

          reverse-search text:该命令可以显示包含text 的前一行

      •  函数调用:

          call function:强制调用某函数,它会显示函数返回值(如果函数返回值不是void类型)

      • 调试进程

          gdb attach pid:调试已运行的进程,pid为进程号

      • 别的命令:

          cd :改变当前工作目录

          clear:删除刚才停止处的断点

          commands :命中断点时,列出将要执行的命令

            display :程序停止时显示变量和表达时

          up :上移栈帧,使另一函数成为当前函数

            down :下移栈帧,使得另一个函数成为当前函数

          frame :选择下一条continue命令的帧

          jump 在源程序中的另一点开始运行

            kill 异常终止在gdb 控制下运行的程序

            pwd :显示当前工作目录

               ptype 显示一个数据结构(如一个结构或C++类)的内容

            quit :退出gdb

            set variable ["args"] = "value":给变量赋值,变量为args,value为设定值

            signal :将一个信号发送到正在运行的进程

            undisplay display :命令的反命令,不要显示表达式

            watch :在程序中设置一个监测点(即数据断点)

            whatis :显示变量或函数类型

    未完待续...

  • 相关阅读:
    PyCharm使用(完全图解(最新经典))
    pg存储过程学习
    sql_to_sqlalchemy
    python中嵌入lua解析器
    Python和lua互相调用
    Lupa
    [cb] Unity Editor 添加右键菜单
    [C#] 委托之Action和Func区别
    [反编译U3D]Decompile Unity Resources
    [cb] Assetbundle打包(一)
  • 原文地址:https://www.cnblogs.com/coder-zyc/p/9595691.html
Copyright © 2011-2022 走看看