gdb是一个很有用的调试工具,自己做linux下的开发,天天用的说。下面说一下自己平常实际操作。
1,gdb 可执行程序,进入调试。
2,r 运行程序。若带参数,则r 参数一 参数二 。
3,既然调试,必有断点。break命令(可以简写为b)。
break routine-name 在指定例程的入口处设置。
4,continue ,继续运行程序,直到断点等。
5,list 列出当前运行程序原始文件内容。
6,until 某一行,跟踪某一个接口时,运行到该接口的某一行。list配合使用。
7,next 单步执行程序。这个是以行为单位,这行如果调用其它函数,一会一行就过去。若想看到,这个函数内部执行过程,则用step命令,跟进。
8,info b查看已设置断点。delete(简写d)删除断点。断点都有序号num。d 1就是删除第一断点。若不带序号,则全部删除。 若想暂时不适用某个断点。disable num。继续使用enable num。 运行到某个断点时,想要删除该断点,也可以用clear 直接清除。
9,print(简写p)用于打印数据。p sizeof(struct xxx),p i。p 后面加上你想看的东西。
10,shell命令,linux 下回到终端,进行一些操作,然后exit继续回到gdb。
11,call func。这个很实用,直接调用某一接口,可以直接调试该接口,也可以查看或取得该接口的返回值,很有用。
12,watch 命令,用于跟踪某一变量数值变化。当我们实在不知道一个数据被在哪里改变的时候,用这个。
14,bt,where两个命令用于查看栈的调用情况。bt full可以看到详细信息。
13,多线程技巧:info threads,查看运行的线程,每个线程都会有一个编号,如有lock状态,则是死锁。若要切换到对应线程,则用thread num。set schedulre-locking on/off 用于控制其它线程是继续运行,还是暂停。我们有时候要同时跟踪几个线程的时候,就要先 设置为on,完这个线程,设置为off,在让其它线程运行,从而继续跟踪其它线程。避免多线程下,无法单一跟踪一线程。
14,多进程技巧:必有fork命令。我们如果要跟踪子进程,就 set follow-fork-mode child。若要跟踪父进程,则set follow-fork-mode parent。
15,预期调试技巧,比如程序运行到某个地方,条件不符,但我们又想按照条件符合的情况运行,这时候可以用set命令,比如 a=1时往左,但这个时候a却为零,我们可以set a=1。
*********************************************************************************
backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)
breakpoint 在程序中设置一个断点
cd 改变当前工作目录
clear 删除刚才停止处的断点
commands 命中断点时,列出将要执行的命令
continue 从断点开始继续执行
delete 删除一个断点或监测点;也可与其他命令一起使用
display 程序停止时显示变量和表达时
down 下移栈帧,使得另一个函数成为当前函数
frame 选择下一条continue命令的帧
info 显示与该程序有关的各种信息
jump 在源程序中的另一点开始运行
kill 异常终止在gdb 控制下运行的程序
list 列出相应于正在执行的程序的原文件内容
next 执行下一个源程序行,从而执行其整体中的一个函数
print 显示变量或表达式的值
pwd 显示当前工作目录
pype 显示一个数据结构(如一个结构或C++类)的内容
quit 退出gdb
reverse-search 在源文件中反向搜索正规表达式
run 执行该程序
search 在源文件中搜索正规表达式
set variable 给变量赋值
signal 将一个信号发送到正在运行的进程
step 执行下一个源程序行,必要时进入下一个函数
undisplay display命令的反命令,不要显示表达式
until 结束当前循环
up 上移栈帧,使另一函数成为当前函数
watch 在程序中设置一个监测点(即数据断点)
whatis 显示变量或函数类型