程序调试
(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>:PID是进程ID,
可通过>ps aux | grep <程序名> 获
(2).GDB中链接目标进程
(GDB) attach <PID>
(3).断开链接
(GDB) detach
调试多线程程序
(1).查看线程
(GDB) info thread查看所有线程信息,or:i thr
(2).切换到指定线程
(GDB) thread <线程编号>:选中出现问题的线程,or:thr <线程编号>
(3).调试守护进程
守护进程在启动好子进程后,会自动关闭主进程,如果没有设定监控模式的话,GDB会提示断开与进程的链接。所以必须设定监控对象,设置方式:
(GDB) set follow-fork-mode child/parent