1.要在可执行文件中包含调试信息,需要在编译时加入-g参数
gcc -g test.c -o test
2.启动gdb调试程序
gdb test
3.查看gdb的帮助信息
help
4.查看源代码(l)
list
5.设置断点(b)
在某一行设置一个断点:break 40
在某一个函数入口处设置一个断点: break my_func
6.开始运行程序(r)
run
7.打印变量值(p)
print my_var
8.将局部变量信息全部输出(info)
info locals
9.人为修改变量的值(set)
set my_var=”hello,world”
10.输出断点信息(info)
info break
11.单条语句执行(n)
next
12.继续往下执行程序(c)
continue (c)
13.查看函数堆栈(bt)
backtrace
14.执行shell命令(shell)
shell cmd
15.设定程序运行时的参数(set args)
set args myarg1 myarg2 myarg3
16.查看设置好的参数
show args
17.设置程序的运行路径(path)
path dir
18.查看程序的运行路径(show)
show path
19.设置环境变量(set)
set env env_var = value
20.查看环境变量(show)
show env env_var
21.查看程序当前的状态
info program
22.删除断点(delete)
delete 断点号
23.暂停断点(disable)
disable 断点号
24.单步调试(step)
注意与next的区别,step命令在遇到函数调用时会进入函数内部
25.设置观察点(watch)
watch expr (为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序)
26.查看观察点(info)
info watchpoints
27.设置捕捉点(catch)
catch event (当event发生时,停住程序)
28.调试已运行的程序
两种方法:
1、在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb <program> PID格式挂接正在运行的程序。
2、先用gdb <program>关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。
29.多线程调试
- info thread 查看当前进程的线程。
- thread <ID> 切换调试的线程为指定ID的线程。
- break file.c:100 thread all 在file.c文件第100行处为所有经过这里的线程设置断点。
- set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
- off 不锁定任何线程,也就是所有线程都执行,这是默认值。
- on 只有当前被调试程序会执行。
- step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
30.调试宏
在GCC编译程序的时候,加上-ggdb3参数,这样,你就可以调试宏了。
另外,你可以使用下述的GDB的宏调试命令 来查看相关的宏。
- info macro – 你可以查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
- macro – 你可以查看宏展开的样子。
31.条件断点
条件断点是语法是:break [where] if [condition],这种断点真是非常管用。尤其是在一个循环或递归中,或是要监视某个变量。注意,这个设置是在GDB中的,只不过每经过那个断点时GDB会帮你检查一下条件是否满足。
32.自动化调试(command)
自动化调试,简单的理解就是把一组gdb命令打包。示例如下:
( gdb ) break func
Breakpoint 1 at 0x3475678 : file test . c , line 12.
( gdb ) command 1
Type commands for when breakpoint 1 is hit , one per line .
End with a line saying just "end" .
> print arg1
> print arg2
> print arg3
> end
( gdb )
当我们的断点到达时,自动执行command中的三个命令,把func的三个参数值打出来。