程序调试
(1)断点设置
A.设置断点
(GDB) break
or b
:对当前正在执行的文件中的指定函数设置断点。
(GDB) break
or b
:对当前正在执行的文件中的特定行设置断点。
(GDB) break
or b
:对指定文件的指定行设置断点。最常用的设置断点方式。
(GDB) break
or b
:对指定文件的指定函数设置断点。
(GDB) break
:当前指令行+/-偏移量出设置断点。 or b
(GDB) break
:指定地址处设置断点。or:b
B.查看、删除断点
(GDB) info break :显示所有断点以及监视点。or:(GDB) i
b
(GDB) delete
:删除编号指向的断点或者监视点。or d
(GDB) clear
:删除该行的断点。
(GDB) clear
:删除改行的断点。
C.设置无效、有效断点:
(GDB) disable
: 当前断点设置为无效。
(GDB) enable
:当前断点设置为有效。
(2).监视点
可以监视某个变量,在变量被访问或者被修改时程序会在当前点进入断点。删除,查看监视点的方式与断点相同。设置监视点方式如下:
(GDB) watch
:表达式发生变化时暂停。
(GDB) awatch
:表达式访问或者改变时暂停。
(GDB) rwatch
:表达式被访问时暂停。
(3).条件断点
在调试程序过程中,有时候只想在某个条件下停止程序,然后进行单步调试,而条件断点就是为此而设计。下面是条件断点的操作方式:
(GDB) b
if : 例如:b main.cpp:8 if x=10
&& y=10
(GDB) condition
:删除该断点的条件。
(GDB) condition
:修改断点条件。例如:condition 1 x=10
&& y=10
(4).断点命令
每次断点发生时候,想要查看的变量很多时,如果每个变量都手动print则需要浪费很多时间。断点命令可以在断点发生时批量执行GDB命令。断点命令的设置方式:
(GDB) commands
(GDB) >print x
(GDB) >print y
(GDB) >end
首先输入GDB命令commands
然后回车,这时候会出现>提示符。出现>提示符后可以输入断点发生时需要执行的GDB命令,每行一条,全部输入完成后输入end结束断点命令。
(5).反复执行
单步执行时如果进入了不关心的函数,你想立即跳出函数;或者进入了大循环中,你想立即循环。
(GDB) ignore
:忽略N次断点。
(GDB) c N: 执行N次指令,会忽略断点。
(GDB) s/stepi/n/nexti N:往后执行N行,不会忽略断点。
(GDB) finish:执行完当前函数后停止,不会忽略断点。
(GDB) until:执行完当前循环后停止,不会忽略断点。
(GDB) until
:执行到指定地址停止。
(6).设置变量值
对变量的值进行控制,可以更快的调试自己的程序。下面就是设置变量值的方法:
(GDB) set variable
=
:将变量的值设定为指定表达式的值。如 set variable
x=10
(7).手动生成转储文件
(GDB) generate-core-file or:gcore
调试在线进程
(1).启动GDB时链接目标进程:在启动GDB的时候,通过参数-p指定目标进程,就可以进入调试状态。刚链接成功后,程序是暂停运行状态,
可设置断点等操作,后输入(GDB) c 命令继续运行。
>gdb -p
:PID是进程ID,
可通过>ps aux | grep
获
(2).GDB中链接目标进程:
(GDB) attach
(3).断开链接:
(GDB) detach
调试多线程程序
(1).查看线程
(GDB) info thread查看所有线程信息,or:i thr
(2).切换到指定线程
(GDB) thread
:选中出现问题的线程,or:thr
(3).调试守护进程
守护进程在启动好子进程后,会自动关闭主进程,如果没有设定监控模式的话,GDB会提示断开与进程的链接。所以必须设定监控对象,设置方式:
(GDB) set follow-fork-mode
child/parent