好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
GDB 不仅是一个调试工具,它也是一个学习源码的好工具。用它开跟踪代码的分支和数据的流向,这样走上几个来回之后,再结合源码,就能够对程序的整体情况“了然于胸”。
gdb 程序名 [corefile] corefile是可选的,但能增强gdb的调试能力。
Linux默认是不生成corefile的,所以需要在.bashrc文件中添加(开发期间设置打开就行)
ulimit -c unlimited
(修改完.bashrc文件后记得. .bashrc让修改生效)
help h 按模块列出命令类
help xx 查看某命令的使用
gdb -p pid attach指定pid的程序, detach用于detach进程
run r 运行程序, 它的后面可以加上**程序的参数**,程序运行完重新执行的时候也用这个
start 断点到main函数第一行
dir sourcePath 若调试的程序没有源码或源码的位置有移动,需要再次指定源码路径
【程序运行参数】
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。
【查看】
list 显示附近的10行代码
print 变量,表达式。
print 'file'::变量,表达式,''是必须的,以便让gdb知道指的是一个文件名。
print funcname::变量,表达式
whatis 命令可以告诉你变量的类型
ptype pt 查看变量的真实类型,不受 typedef 的影响
info xx 查看xx的信息
watch a 观察a的值,当有变化时,停止,其实一个watch就是一个特殊的断点(数据断点)
i watch 显示观察点
delete num 删除一个watch
display 变量名 用于监视变量值,每次gdb中断都会打印相应的值,不用老用print打印了。
undisplay 取消观察变量
i display 查看display的值
【打印类相关】
p *this: 打印出当前类里所有的成员的值
p this->member 打印出当前类里的某个成员的值
ptype this 打印出当前类里所有的成员(原型)
whatis this 打印出当前类的类型
set print element 0 当字符串太长导致打印不全时用这个打破限制
【stack】
bt backtrace|where|info stack 打印出错的函数调用栈
up/down 在函数调用栈里上下移动。
frame f x 切换到第几个函数帧
info frame
【断点】
break b命令设置断点
break linenum
break funcname
break filename:linenum
break filename:funcname
break...if... 条件断点
info break(i b) 查看断点
condition 断点编号 条件 给普通断点加命中的条件
enable breakpoints 启用断点
disable breakpoints 禁用断点
delete 删除一个断点,若没有参数删除所有,若加断点序号删除指定的
tbreak 临时断点,只生效一次
【控制命令】
start 单步执行,运行程序,停在第一行执行语句
continue c 命令从断点以后继续执行,直到运行到下一个断点。
step 相当于step into
next 相当于step over
finish fin 结束当前函数,返回到函数调用点
return [value] 停止执行当前函数,将value返回给调用者,相当于step return
quit或者Ctrl+d 退出
until 行号 使程序运行到指定的行
jump 行号 使程序直接跳到指定的行,其行为是不可控的,因为其破坏了程序本来的执行流
【修改命令】
set variable varname = value 改变一个变量的值
p 也可以进行变量的修改,比如 p server.port = 1001
【多线程】
info threads
thread 线程编号 切换到指定线程
set scheduler-locking on/step/off
on 可以锁定当前线程,使其他线程暂停,达到只执行当前线程的效果
step 只有再进行单步调试时才锁定当前线程,执行其他的命令其他线程依然有机会执行
off 关闭线程锁定
【多进程】
show follow-fork mode 查看fork的mode
set follow-fork parent/child fork时进父进程还是子进程
【TUI模式】
`-tui` 选项进入TUI模式
layout src|asm|regs
`Ctrl+X+A`组合键可以在TUI模式和非TUI模式切换
在tui模式下,上下键是用来控制src窗口的,可以通过ctrl+N ctrl+P来显示上一条或下一条命令
【cgdb】
gdb的升级版,在gdb上做了一层包装,调试看源码更方便
【visualGDB】
visual studio的插件,可以通过ssh连接到远程机器进行远程调试,并且还可以使用图形化的界面
【其他】
enter 重复执行上条命令
winheight wh Set or modify the height of a specified window
handle SIGINT nostop print pass
ctrl + c信号会让gdb中断,若想要将信号传递给被调试程序,则可用上面的命令设置
使用break functionname未能中断时,换成文件+行号的再试
# server端
gdbserver <host>:<port> <目标程序路径>
# client端
1.运行 gdb
2.执行 target remote <被调试主机的IP地址>:<端口号>