zoukankan      html  css  js  c++  java
  • gdb常用命令

    产生调试信息

    g++/gcc:

    使用-g选项

    使用-O0选项去除优化

    makefile

    使用-g选项

    使用-O0选项去除优化

    CMakeLists.txt

    添加SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")

    总览 

    • b —— break,在指定的行或函数处设置断点
    • ib —— info breakpoints,打印未删除的所有断点,观察点和捕获点的列表
    • dis —— disable,禁用断点
    • enable —— 启用断点
    • clear —— 清除指定行或函数处的断点
    • d —— delete, 删除断点
    • tbreak —— 设置临时断点,参数同 break,但在程序第一次停住后会被自动删除
    • watch —— 为表达式(或变量)设置观察点,当表达式(或变量)的值有变化时,暂停程序执行
    • s —— step,单步跟踪,如果有函数调用,会进入该函数
    • reverse-step —— 反向单步跟踪,如果有函数调用,会进入该函数
    • n —— next,单步跟踪,如果有函数调用,不会进入该函数
    • reverse-next —— 反向单步跟踪,如果有函数调用,不会进入该函数
    • return —— 使选定的栈帧返回到其调用者
    • fin ——  finish,执行直到选择的栈帧返回
    • u ——  until, 执行直到达到当前栈帧中当前行后的某一行(用于跳过循环、递归函数调用)
    • c —— continue,恢复程序执行
    • p —— print, 打印表达式 EXP 的值
    • x —— 查看内存
    • display —— 每次程序停止时打印表达式 EXP 的值(自动显示)
    • info display —— 打印早先设置为自动显示的表达式列表
    • disable display —— 禁用自动显示
    • enable display —— 启用自动显示
    • undisplay —— 删除自动显示项
    • h —— help,打印命令列表(带参数时查找命令的帮助)
    • attach —— 挂接到已在运行的进程来调试
    • r —— run, 启动被调试的程序
    • bt —— backtrace,查看程序调用栈的信息
    • ptype — 打印类型 TYPE 的定义
    • set —— 更改变量
    • info —— 查看信息

    命令详解

    • b —— break,在指定的行或函数处设置断点
      • break 当不带参数时,在所选栈帧中执行的下一条指令处设置断点。
      • break <function-name> 在函数体入口处打断点,在 C++ 中可以使用 class::function 或 function(type, ...) 格式来指定函数名。
      • break <line-number> 在当前源码文件指定行的开始处打断点。
      • break -Nbreak +N 在当前源码行前面或后面的 N 行开始处打断点,N 为正整数。
      • break <filename:linenum>  在源码文件 filename 的 linenum 行处打断点。
      • break <filename:function>  在源码文件 filename 的 function 函数入口处打断点。
      • break <address> 在程序指令的地址处打断点。
      • break ... if <cond>  设置条件断点,... 代表上述参数之一(或无参数),cond为条件表达式,仅在 cond 值非零时暂停程序执行。
    • ib —— info breakpoints,打印未删除的所有断点,观察点和捕获点的列表
      • info breakpoints [list...]
      • info break [list...]
      • list... 用来指定若干个断点的编号(可省略),可以是 2, 1-3, 2 5 等。
    • dis —— disable,禁用断点

    禁用一些断点。参数是用空格分隔的断点编号。要禁用所有断点,不加参数。

    禁用的断点不会被忘记,但直到重新启用才有效。

      • disable [breakpoints] [list...]
      • breakpoints 是 disable 的子命令(可省略),list... 同 info breakpoints 中的描述。
    • enable —— 启用断点
        启用一些断点。给出断点编号(以空格分隔)作为参数。没有参数时,所有断点被启用。
      • enable [breakpoints] [list...] 启用指定的断点(或所有定义的断点)。
      • enable [breakpoints] once list... 临时启用指定的断点。GDB 在停止您的程序后立即禁用这些断点。
      • enable [breakpoints] delete list... 使指定的断点启用一次,然后删除。一旦您的程序停止,GDB 就会删除这些断点。等效于用 tbreak 设置的断点。
    • clear —— 清除指定行或函数处的断点

    在指定行或函数处清除断点。参数可以是行号,函数名称或 * 跟一个地址。

    clear 当不带参数时,清除所选栈帧在执行的源码行中的所有断点。

      • clear <function>clear <filename:function>  删除在命名函数的入口处设置的任何断点。
      • clear <linenum>clear <filename:linenum>  删除在指定的文件指定的行号的代码中设置的任何断点。
      • clear <address> 清除指定程序指令的地址处的断点。
    • d —— delete, 删除断点

    删除一些断点或自动显示表达式。参数是用空格分隔的断点编号。要删除所有断点,不加参数。

      • delete [breakpoints] [list...]
    • tbreak —— 设置临时断点,参数同 break,但在程序第一次停住后会被自动删除
    • watch —— 为表达式(或变量)设置观察点,当表达式(或变量)的值有变化时,暂停程序执行

    为表达式设置观察点。

      • watch [-l|-location] <expr>  每当一个表达式的值改变时,观察点就会暂停程序执行。

    如果给出了 -l 或者 -location,则它会对 expr 求值并观察它所指向的内存。例如,watch *(int *)0x12345678 将在指定的地址处观察一个 4 字节的区域(假设 int 占用 4 个字节)。

     

    • s —— step,单步跟踪,如果有函数调用,会进入该函数
      • step [N] 参数 N 表示执行 N 次(或由于另一个原因直到程序停止)。
    • reverse-step —— 反向单步跟踪,如果有函数调用,会进入该函数
      • reverse-step [N] 参数 N 表示执行 N 次(或由于另一个原因直到程序停止)。
    • n —— next,单步跟踪,如果有函数调用,不会进入该函数
      • next [N]
    • reverse-next —— 反向单步跟踪,如果有函数调用,不会进入该函数
      • reverse-next [N]
    • return —— 使选定的栈帧返回到其调用者
      • return <expression>  将 expression 的值作为函数的返回值并使函数直接返回。
    • fin ——  finish,执行直到选择的栈帧返回
    • u ——  until, 执行直到达到当前栈帧中当前行后的某一行(用于跳过循环、递归函数调用)
      • until <location>  或 u <location>  继续运行程序,直到达到指定的位置,或者当前栈帧返回。
    • c —— continue,恢复程序执行
      • continue [N] 如果从断点开始,可以使用数字 N 作为参数,这意味着将该断点的忽略计数设置为 N - 1(以便断点在第 N 次到达之前不会中断)。
    • p —— print, 打印表达式 EXP 的值
      • print [expr] 或 print /f [expr]expr 是一个(在源代码语言中的)表达式。

    默认情况下,expr 的值以适合其数据类型的格式打印;您可以通过指定 /f 来选择不同的格式,其中 f 是一个指定格式的字母;详见输出格式

    如果省略 expr,GDB 再次显示最后一个值。

    要以每行一个成员带缩进的格式打印结构体变量请使用命令 set print pretty on,取消则使用命令 set print pretty off

    可使用命令 show print 查看所有打印的设置。

     

    • x —— 查看内存
      • x/nfu <addr>  或 x <addr> nf 和 u 都是可选参数,用于指定要显示的内存以及如何格式化。addr 是要开始显示内存的地址的表达式。

        n 重复次数(默认值是 1),指定要显示多少个单位(由 u 指定)的内存值。

        f 显示格式(初始默认值是 x),显示格式是 print('x','d','u','o','t','a','c','f','s') 使用的格式之一,再加 i(机器指令)。

        u 单位大小,b 表示单字节,h 表示双字节,w 表示四字节,g 表示八字节。

        例如:

        x/3uh 0x54320 表示从地址 0x54320 开始以无符号十进制整数的格式,双字节为单位来显示 3 个内存值。

        x/16xb 0x7f95b7d18870 表示从地址 0x7f95b7d18870 开始以十六进制整数的格式,单字节为单位显示 16 个内存值。

    • display —— 每次程序停止时打印表达式 EXP 的值(自动显示)
      • display <expr>,  display/fmt <expr>  或 display/fmt <addr> fmt 用于指定显示格式。像 print 命令里的 /f 一样。

        对于格式 i 或 s,或者包括单位大小或单位数量,将表达式 addr 添加为每次程序停止时要检查的内存地址。

    • info display —— 打印早先设置为自动显示的表达式列表
    • disable display —— 禁用自动显示
    • enable display —— 启用自动显示
    • undisplay —— 删除自动显示项
    • h —— help,打印命令列表(带参数时查找命令的帮助)
    • r —— run, 启动被调试的程序
      • 可以直接指定参数,也可以用 set args 设置(启动所需的)参数。

        例如: run arg1 arg2 ... 等效于

      

    set args arg1 arg2 ...
    run
    • bt —— backtrace,查看程序调用栈的信息
      • bt 打印整体栈帧信息,每个栈帧一行。
      • bt n 类似于上,但只打印最内层的 n 个栈帧。
      • bt -n 类似于上,但只打印最外层的 n 个栈帧。
      • bt full n 类似于 bt n,还打印局部变量的值。
      • where 和 info stack(缩写 info s) 是 backtrace 的别名
    • ptype — 打印类型 TYPE 的定义
      • 打印类型 TYPE 的定义。

        用法: ptype[/FLAGS] TYPE-NAME | EXPRESSION

        参数可以是由 typedef 定义的类型名, 或者 struct STRUCT-TAG 或者 class CLASS-NAME 或者 union UNION-TAG 或者 enum ENUM-TAG

        根据所选的栈帧的词法上下文来查找该名字。

        类似的命令是 whatis,区别在于 whatis 不展开由 typedef 定义的数据类型,而 ptype 会展开。

    • list —— 显示行号
      • list [filename] 查看文件内容

      • list [linenum] 查看某一行内容

      • list [linenum] [linenum] 查看某些行范围的内容

      • list [functionname] 查看某个函数内容

      • list 显示断点处程序

    • set —— 更改变量
      (gdb) set var a=0.0
      (gdb) set var array_a={0.0, 0.0, 1.0, 1.0
    • info —— 查看信息
      •  info local :查看所有的局部变量
      •  info stack:查看此时的栈状态
      •  info args:打印出当前函数的参数名及其值
      • info catch:打印出当前的函数中的异常处理信息。
      • info line:查看源代码在内存中的地址。info line后面可以跟“行号”,“函数名”,“文件名:行号”,“文件名:函
        数名”,这个命令会打印出所指定的源码在运行时的内存地址
      • info break: 查看断点信息。
      • info threads:看正在运行程序中的线程信息
      • info registers:查看寄存器的情况。(除了浮点寄存器)
      • info all-registers:查看所有寄存器的情况。(包括浮点寄存器)
      • info registers <regname>:查看所指定的寄存器的情况。

    例子

    http://blog.jobbole.com/107925/?utm_source=blog.jobbole.com&utm_medium=relatedPosts

    http://blog.jobbole.com/107759/

    参考

    http://blog.jobbole.com/112547/?utm_source=blog.jobbole.com&utm_medium=relatedPosts

  • 相关阅读:
    AGC037F Counting of Subarrays
    AGC025F Addition and Andition
    CF506C Mr. Kitayuta vs. Bamboos
    AGC032D Rotation Sort
    ARC101F Robots and Exits
    AGC032E Modulo Pairing
    CF559E Gerald and Path
    CF685C Optimal Point
    聊聊Mysql索引和redis跳表
    什么是线程安全
  • 原文地址:https://www.cnblogs.com/freedomabcd/p/7771052.html
Copyright © 2011-2022 走看看