GDB主要完成以下功能:
1、自由启动程序;
2、程序可在指定的断点处停住;
3、程序被停住时,可以获取此时程序的信息、查看变量值;
4、可单步调试,检查每步的结果。
GDB调试的是C/C++的程序,因此想要更好的调试程序,需要在编译时把调试信息加到可执行文件中,即使用编译器的 -g 参数。如:
1、C语言:gcc -g hello.c -o hello
2、C++:g++ -g hello.cpp -o hello
如果没有-g,将看不见程序的函数名、变量名,所代替的全是运行时的内存地址
信号是一种软中断,是一种处理异步事件的方法,例如:
SIGINT:中断字符信号,Ctrl+C;
SIGBUS:硬件故障的信号;
SIGCHLD:子进程状态改变信号;
SIGKILL:终止程序运行的信号。
使用handle命令可以处理上述任何一种信号,其参数有:
Nostop:处理该信号时,GDB会打印消息告诉你收到这种信号;
Stop:处理该信号时,GDB会停住你的程序;
Print:处理该信号时,GDB会显示出一条信息;
Noprint:处理该信号时,GDB不会告诉你收到信号的信息;
Pass/noignore:处理该信号时,GDB不处理信号;
Nopass/ignore:处理该信号时,GDB不会让程序处理这个信号。
命令:
info signals/info handle:查看有哪些信号在被GDB检测中。
案例:
handle SIGPIPE noprint nostop
handle SIGUSR2 noprint nostop
功能主要划分为如下几大类:
breakpoints:断点设置类
data:数据查看类
files:指定并查看文件类
internals:维护命令类
running:程序执行类
stack:调用栈查看类
statu:状态查看类
tracepoints:跟踪程序执行类
命令 | 释义 |
---|---|
t | pid |
f | 栈号 |
Disassemble | 反汇编 |
thread apply all bt | 打印全部线程堆栈 |
cat /proc/2498/maps | 打印指定pid的地址 |
info thread | 显示当前可调试的所有线程 |
info frame | 查看栈帧的信息 |
bt | 堆栈 |
info threads | 显示当前可调试的所有线程 |
thread PID | 切换当前调试的线程为指定PID的线程 |
info proc | 显示当前程序可执行文件相关信息 |
调试程序中,暂停程序运行是必须的,GDB 可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。
当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。
在 gdb 中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。
如果要恢复程序运行,可以使用c或是continue命令。
1、break 在指定函数处停住
2、break 在指定行号停住
3、 break filename:linenum 在源文件 filename 的linenum行处停住
4、 break filename:function 在源文件 filename 的function函数的入口处停住
5、 break *address 在程序运行的内存地址处停住
6、 break break命令没有参数时,表示在下一条指令处停住
7、 break ... if
...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序
使用info 命令,如下所示:(注:n 表示断点号)
info breakpoints [n]
info break [n]
观察点用来观察某个表达式的值是否有变化了,如果有变化,马上停住程序
有下面的几种方法来设置观察点:
1、watch
为表达式(变量)expr 设置一个观察点。一量表达式值有变化时,马上停住程序
2、rwatch
当表达式(变量)expr被读时,停住程序
3、awatch
当表达式(变量)的值被读或被写时,停住程序
info watchpoints:列出当前所设置了的所有观察点