设为首页 加入收藏

TOP

调试工具gdb(一)
2018-10-21 20:10:09 】 浏览:135
Tags:调试 工具 gdb

1.1 gdb符号调试器简介

  gdb是一个用来调试C和C++程序的功能强大的调试器,它能在程序运行时观察程序的内部结构和内存的使用情况。

  gdb主要提供以下几种功能:

  • 监视程序中变量值的变化
  • 设置断点,使程序在指定的代码行上暂停执行,便于观察
  • 单步执行代码
  • 分析崩溃程序产生的core文件

    gdb filename(执行文件名)

    编译时需加上-g 或 -ggdb3 选项

1.2 gdb功能详解及其应用

  1.2.1调试步骤

    1.调用gdb

      gdb filename

    2.设置断点并调试

      break functionname/linenumer

      run 执行程序

      step 单步跟踪程序代码

    print命令:

      print 表达式

      print 变量=表达式

      print 开始表达式@要打印连续内存空间的大小

    display命令:

      display 表达式

      在使用display命令时,每次调试器中断程序,挂起指令都要显示变量的值

    next命令:

      不进入函数内部

    quit命令:

      退出gdb

  1.2.2 显示数据命令

    1. print命令与display命令

    finish 执行完当前函数

    2. 内存检查命令

      x /format address

        format指显示单元的个数以及显示的格式

      例如:x/2c 0x120100fa0

    3.printf      类似于c里的printf()函数

      例如:printf"%2.2s\n",(char*)0x120100fa0

    4.使用set命令

      set variable 变量=表达式                      设置变量值

  1.2.3 使用断点

    continue命令和cont命令(cont 数字  表示执行数字次继续)

    break 行号

    break 函数名

    条件断点:

      condition 断点编号 表达式                   程序在表达式为真时中断

    tbreak  行号  临时断点

    (break  行号

       enable delete 断点号)等效于临时上一个断点

    enable  断点编号                恢复失效断点

    disable  断点编号     使断点失效

    delete    断点编号或表达式        清除断点(无提示信息)

    clear   要清除的断点所在行号      清除断点(有提示信息)

  1.2.4 使用观察窗口

    watch  表达式                     如果表达式中某个变量的取值超过了范围,就不能再对表达式取值了。这一点与条件断点设置不同,因为它只在代码的固定位置取值。

  1.2.5 查看栈信息

    backtrace

    bt

    bt n  栈顶上n层栈信息

    bt -n  栈顶下n层栈信息

    frame n

    f n          n是一个从0开始的整数,是栈中的层编号。比如:frame 0表示栈顶,frame 1表示栈的第二层

    up n  表示向栈的上面移动n层,不输入n表示移动一层

    down n  表示向栈的下面移动n层

    以下为不带提示信息的移动栈层信息:

      select-frame n

      up-silently n

      down-silently n

      ---------------

      frame 或 f               查看当前栈层信息(包括栈层编号,当前函数名,函数参数值,函数所在文件及行号,函数执行到的语句)

      info frame 或 info f    该命令会显示更为详细的当前栈层的信息,只不过大多数都是运行时的内地址。

      info args  显示出当前函数的参数名及值

      info locals  显示出当前函数中所有局部变量的值

      info catch  显示当前函数中的异常处理信息      

     1.2.6 查看源程序

    1. 显示源代码 

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

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

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

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

      set listsize <count>  设置一次显示源代码的行数

      show listsize  查看当前listsize的设置

      list <first>,<last>  显示从first行到last行之间的源代码

      list ,<last>  显示当前行到last行之间的源代码

      list +  向后显示源代码

      一般来说,在list后面可以跟以下这些参数。

      <linenum>:行号。

      <+offset>:当前行号的正偏移量

      <-offset>:当前行号的负偏移量

      <filename:linenumber>:哪个文件的哪一行

      <function>:函数名

      <filename:function>:哪个文件的哪个函数

      <*address>:程序运行时的语句在内存中的地址

    2.搜索源代码

      forward-search <regexp>

      search <regexp>  向前搜索

      reverse-search <regexp>  全部搜索

    3.指定源文件的路径

      directory <dirname ...>

      dir <dirname ...>

      directory  清除所有自定义源文件搜索路径信息

      show directories  显示定义了源文件搜索路径

    4.源代码的内存

      info line  行号/函数名

      info line 文件名:行号/文件名:函数名

      disassemble func  查看func的汇编代码

      disassemble address

  1.2.7 查看运行时数据

    1.表达式

      @  一个和数组有关的操作符

      ::  指定一个在文件或是一个函数中的变量

      {<type>} <addr>   表示一个指向内存地址<addr>的类型为type的一个对象

    2.程序变量

      全局变量(所有文件可见)

      静态全局变量(当前文件可见的)

      局部变量(当前Scope可见的)

      示例:

        file::variable

        function::variable

        p 'f2.c'::x

    3.数组

      例如:程序中有如下语句

        int *array = (int *)malloc(len * sizeof(int));

      p *array@len

      如果是静态数组的话,直接用"print 数组名"就可以显示数组中所有数据的内容了。

    4.输出格式

      x  按十六进制格式显示变量

      d  按是禁止格式显示变量

      u  按十六进制格式显示无符号整形

      o  按八进制格式显示变量

      t  按二进制格式显示变量

      a  按十六进制格式显示变

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇2018/7/16 YMOI模拟 NOIP2013D2T3.. 下一篇DP动态规划练习

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目