一、使用GDB调试程序

一、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 调试方式

  1. gdb < program >
    program是可执行文件
  2. gdb < program > core
    用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件
  3. gdb < program > < PID >
    如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb 会自动attach 上去,并调试他
  4. gdb < program >
    关联源代码,并进行gdb
  5. 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:列出当前所设置了的所有观察点

猜你喜欢

转载自blog.csdn.net/future_sky_word/article/details/128267789