文章目录
一、GDB的功能
GDB主要完成以下功能:
1、自由启动程序;
2、程序可在指定的断点处停住;
3、程序被停住时,可以获取此时程序的信息、查看变量值;
4、可单步调试,检查每步的结果。
二、如何增加debug信息
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
四、GDB的命令
4.1 功能划分
功能主要划分为如下几大类:
breakpoints:断点设置类
data:数据查看类
files:指定并查看文件类
internals:维护命令类
running:程序执行类
stack:调用栈查看类
statu:状态查看类
tracepoints:跟踪程序执行类
4.2 调试方式
- gdb < program >
program是可执行文件 - gdb < program > core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件 - gdb < program > < PID >
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb 会自动attach 上去,并调试他 - gdb < program >
关联源代码,并进行gdb - gdb attach < PID >
用attach命令来挂接进程的PID,用detach来取消挂接的进程
4.3 常用命令
命令 | 释义 |
---|---|
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 | 显示当前程序可执行文件相关信息 |
4.4 暂停运行
调试程序中,暂停程序运行是必须的,GDB 可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。
当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。
在 gdb 中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。
如果要恢复程序运行,可以使用c或是continue命令。
4.4.1 设置断点的方式
1、break <function> 在指定函数处停住
2、break <linenum> 在指定行号停住
3、 break filename:linenum 在源文件 filename 的linenum行处停住
4、 break filename:function 在源文件 filename 的function函数的入口处停住
5、 break *address 在程序运行的内存地址处停住
6、 break break命令没有参数时,表示在下一条指令处停住
7、 break ... if <condition>
...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序
4.4.2 查看断点的方式
使用info 命令,如下所示:(注:n 表示断点号)
info breakpoints [n]
info break [n]
4.4.3 观察点
观察点用来观察某个表达式的值是否有变化了,如果有变化,马上停住程序
有下面的几种方法来设置观察点:
1、watch <expr>
为表达式(变量)expr 设置一个观察点。一量表达式值有变化时,马上停住程序
2、rwatch <expr>
当表达式(变量)expr被读时,停住程序
3、awatch <expr>
当表达式(变量)的值被读或被写时,停住程序
info watchpoints:列出当前所设置了的所有观察点