玩转Linux GDB调试(详细)

启动

1、 gdb < program >
program也就是你的执行文件, 一般在当然目录下。
2、 gdb < program > core
用gdb同时调试一个运行程序和core文件, core是程序非法执行后core dump后产生的文件。
3、 gdb < program > < PID>
如果你的程序是一个服务程序, 那么你可以指定这个服务程序运行时的进程ID。 gdb会自动attach上去, 并调试他。
program应该在PATH环境变量中搜索得到。

在这里插入图片描述

GDB样貌:help查看帮助信息

GDB同样可以TAB提示:如
敲入b按两次TAB键, 你会看到所有b打头的命令:
(gdb) b
backtrace break bt
(gdb)
只记得函数的前缀, 可以这样:
(gdb) b make_ <按TAB键>
( 再按下一次TAB键, 你会看到:以make开头的全部函数)

当以gdb < program>方式启动gdb后, gdb会在PATH路径和当前目录中搜索< program>的源文件。 如要确认gdb是否读到源文
件, 可使用l或list命令, 看看gdb是否能列出源代码。
在gdb中, 运行程序使用r或是run命令。 程序的运行, 有可能需要设置下面四方面的事。
1、 程序运行参数。
set args 可指定运行时参数。( 如: set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。
2、 运行环境。
path < dir> 可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如: set env USER=hchen
show environment [varname] 查看环境变量。
3、 工作目录。
cd < dir> 相当于shell的cd命令。
pwd 显示当前的所在目录。
4、 程序的输入输出。
info terminal 显示你程序用到的终端的模式。
使用重定向控制程序输出。如: run > outfile
tty命令可以指写输入输出的终端设备。如: tty /dev/ttyb

退出
quit

(1)断点

break
在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。
break
在指定行号停住。
break +offset
break -offset
在当前行号的前面或后面的offset行停住。 offiset为自然数。

(2)设置- -

  • 设置观察点

watch
为表达式( 变量) expr设置一个观察点。 一量表达式值有变化时, 马上停住程序。
rwatch
当表达式( 变量) expr被读时, 停住程序。
awatch
当表达式( 变量) 的值被读或被写时, 停住程序。
info watchpoints
列出当前所设置了的所有观察点。

  • 设置捕捉点

catch
当event发生时, 停住程序。

  • 维护停止点
    (1)清除
    clear
    清除所有的已定义的停止点。
    clear < function>
    clear < filename:function>
    清除所有设置在函数上的停止点。
    clear < linenum>
    clear < filename:linenum>
    清除所有设置在指定行上的停止点。
    delete [breakpoints] [range…]
    删除指定的断点, breakpoints为断点号。

(2)停止

disable [breakpoints] [range…]
disable所指定的停止点, breakpoints为停止点号。 如果什么都不指定, 表示disable所有的停止点。 简写命令是dis.
enable [breakpoints] [range…]
enable所指定的停止点, breakpoints为停止点号。
enable [breakpoints] once range…
enable所指定的停止点一次, 当程序停止后, 该停止点马上被GDB自动disable。
enable [breakpoints] delete range…
enable所指定的停止点一次, 当程序停止后, 该停止点马上被GDB自动删除。

调试

  • 继续运行程序

continue [ignore-count]
c [ignore-count]
fg [ignore-count]

  • 单步调试

  • 跳转执行

jump < linespec>
指定下一条语句的运行点。< linespce>可以是文件的行号, 可以是file:line格式, 可以是+num这种偏移量格式。 表式着
下一条运行语句从哪里开始。
jump < address>
这里的< address>是代码行的内存地址。

查看

  • 堆栈信息

bt

  • 源代码

list < linenum>
显示程序第linenum行的周围的源程序。
list < function>
显示函数名为function的函数的源程序。
list
显示当前行后面的源程序。
list -

list +

list < first>, < last>

  • 寄存器

info registers
查看寄存器的情况。( 除了浮点寄存器)
info all-registers
查看所有寄存器的情况。( 包括浮点寄存器)
info registers <regname …>
查看所指定的寄存器的情况

变量

(1)变量

查看以下三种变量的值:
1、 全局变量( 所有文件可见的)
2、 静态全局变量( 当前文件可见的)
3、 局部变量( 当前Scope可见的)
如果你的局部变量和全局变量发生冲突( 也就是重名), 一般情况下是局部变量会隐藏全局变量, 也就是说, 如果一个
全局变量和一个函数中的局部变量同名时, 如果当前停止点在函数中,用print显示出的变量的值会是函数中的局部变量
的值。 如果此时你想查看全局变量的值时, 你可以使用“ ::” 操作符:
file::variable
function::variable

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值