前言:
在LINUX平台下使用Log+Gdb+Core,一般能应付绝大多数调试程序的场景;
GDB:
用户文档查阅:https://sourceware.org/gdb/current/onlinedocs/gdb/
编译程序时请加上-g选项,关闭优化机制和创建符号表以便调试器调试:gcc/g++ -g
你能用GDB对C/C++程序做什么?
(1)启动程序;
(2)使程序在指定条件下停止;
(3)当程序停止时,检查发生了什么;
(4)更改程序中的内容,以便可以纠正一个错误并继续了解了另一个错误
本文主要教会你使用以上四点!
GDB启动/退出程序
使用GDB启动程序的最简单方法是使用一个参数:
gdb 程序名
使用GDB调试core文件的方法是:
gdb 程序名 core
使用GDB调试正在运行的程序的方法是:
gdb 程序名 进程ID
退出GDB请输入:
quit或者q
使程序开始运行的命令是:
run或者r
使程序单步运行的命令是:
next或者n
使程序继续运行的命令是:
continue或者c
GDB使程序在指定条件下停止
使用gdb给你的程序打一个断点,使它到达某一点时停止。location可以是某一行、某个函数名、某个地址:
break locataion或者b locataion
在包含主函数源文件的38行打一个断点:
break 38
在进入test函数时打断点
break test
在table.cpp源文件的32行打一个断点
break table.cpp:32
假设我们知道函数指针的地址为0x5859c0,则可以在0x5859c0上打一个断点
break *0x5859c0
假设你需要在某个条件时启用断点,在table.cpp源文件的32行,当i=32时打一个断点
break table.cpp:32 if i == 32
假设你的程序是多线程运行,你可能会需要在指定线程打断点
首先查看当前程序的线程信息:
info threads
然后在断点命令后添加线程ID
break locataion thread threadID
你可以通过命令查看当前gdb的断点号,断点的地址和在程序中的位置:
info breakpoints
你可以通过命令删除gdb的断点,breakpoints 是断点号
delete breakpoints
GDB检查发生了什么
当程序停下时,你需要知道当前发生了什么,可以使用命令查看当前栈信息,了解程序运行到哪里;
breacktrace或者bt
也许你想看看当前这个位置之后源代码,则可以运行命令:
list
也许你想看看当前这个位置之前源代码,则可以运行命令:
list -
也许你想看当前变量的相关信息,则可以运行命令:
print variate 或者 p variate
GDB更改程序中的内容
在调试程序过程中,你可能需要修改某些变量的值,则可以运行命令,variate是变量名,value是修改后的值
print variate = value
在调试程序过程中,你可能需要发送信号给当前程序,则可以运行命令,signalvalue是信号量,一般为1~15
signal signalvalue
在调试程序过程中,你可能需要强制结束当前程序运行的函数,则可以运行命令,
return
在调试程序过程中,你可能需要强制调用函数,则可以运行命令,function是函数名
call function 或者 print function
好了!学会使用上面这些命令,基本GDB入门了,下面将拓展一些实用的知识。
GDB日志输出
您可能希望将GDB命令的输出保存到文件中。有几个命令可以控制GDB的日志记录。
启用日志记录:
set logging on
禁用日志记录:
set logging off
set logging file file