[TOC]
# 简介
GNU工具集中的调试器是GDB(GNU Debugger),该程序是一个交互式工具,工作在字符模式。
除gdb外,linux下比较有名的调试器还有xxgdb, ddd, kgdb, ups。
GDB主要帮忙你完成下面四个方面的功能:
1. 启动程序,可以按照你的自定义的要求随心所欲的运行程序。
2. 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3. 当程序被停住时,可以检查此时你的程序中所发生的事。
4. 动态的改变你程序的执行环境。
**yum install -y gcc-c++ gdb**
# 生成调试信息
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:
> gcc -g hello.c -o hello
>
> g++ -g hello.cpp -o hello
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
# 启动GDB
* 启动gdb:`gdb program`
~~~
program 也就是你的执行文件,一般在当前目录下。
~~~
* 设置运行参数
~~~
set args 可指定运行时参数。(如:set args 10 20 30 40 50 )
show args 命令可以查看设置好的运行参数。
~~~
* 启动程序
~~~
run: 程序开始执行,如果有断点,停在第一个断点处
start: 程序向下执行一行。
~~~
# 显示源代码
用list命令来打印程序的源代码。默认打印10行。
~~~
Ø list linenum: 打印第linenm行的上下文内容.
Ø list function: 显示函数名为function的函数的源程序。
Ø list: 显示当前行后面的源程序。
Ø list -: 显示当前行前面的源程序。
~~~
一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数。
~~~
Ø set listsize count:设置一次显示源代码的行数。
Ø show listsize: 查看当前listsize的设置。
~~~
# 断点操作
**1)简单断点**
~~~
break 设置断点,可以简写为b
Ø b 10 设置断点,在源程序第10行
Ø b func 设置断点,在func函数入口处
~~~
**2)多文件设置断点**
C++中可以使用class::function或function(type,type)格式来指定函数名。
如果有名称空间,可以使用namespace::class::function或者function(type,type)格式来指定函数名。
~~~
Ø break filename:linenum -- 在源文件filename的linenum行处停住
Ø break filename:function -- 在源文件filename的function函数的入口处停住
Ø break class::function或function(type,type) -- 在类class的function函数的入口处停住
Ø break namespace::class::function -- 在名称空间为namespace的类class的function函数的入口处停住
~~~
**3)查询所有断点**
* info b
* info break
* i break
* i b
# 条件断点
一般来说,为断点设置一个条件,我们使用if关键词,后面跟其断点条件。
设置一个条件断点:
> b test.c:8 if Value == 5
# 维护断点
1)delete \[range...\] 删除指定的断点,其简写命令为d。
* 如果不指定断点号,则表示删除所有的断点。range表示断点号的范围(如:3-7)。
* 比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。
2) disable \[range...\] 使指定断点无效,简写命令是dis。
如果什么都不指定,表示disable所有的停止点。
3) enable \[range...\] 使无效断点生效,简写命令是ena。
如果什么都不指定,表示enable所有的停止点。
# 调试代码
* run 运行程序,可简写为r
* next 单步跟踪,函数调用当作一条简单语句执行,可简写为n
* step 单步跟踪,函数调进入被调用函数体内,可简写为s
* finish 退出进入的函数
* until 在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,可简写为u。
* continue 继续运行程序,停在下一个断点的位置,可简写为c
* quit 退出gdb,可简写为q
# 数据查看
1)查看运行时数据
print 打印变量、字符串、表达式等的值,可简写为p
~~~
p count 打印count的值
~~~
# 自动显示
你可以**设置一些自动显示的变量**,当程序停住时,或是在你单步跟踪时,这些变量会自动显示。相关的GDB命令是display。
* display 变量名
* info display -- 查看display设置的自动显示的信息。
* undisplay num(info display时显示的编号)
* delete display dnums… -- 删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)
* disable display dnums…
* enable display dnums…
* disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。
# 查看修改变量的值
1)`ptype width` -- 查看变量width的类型
~~~
type = double
~~~
2)`p width `-- 打印变量width 的值
~~~
$4 = 13
~~~
你可以使用set var命令来告诉GDB,width不是你GDB的参数,而是程序的变量名,如:
~~~
set var width=47 // 将变量var值设置为47
~~~
**在你改变程序变量取值时,最好都使用set var格式的GDB命令**
- c语言
- 基础知识
- 变量和常量
- 宏定义和预处理
- 随机数
- register变量
- errno全局变量
- 静态变量
- 类型
- 数组
- 类型转换
- vs中c4996错误
- 数据类型和长度
- 二进制数,八进制数和十六进制数
- 位域
- typedef定义类型
- 函数和编译
- 函数调用惯例
- 函数进栈和出栈
- 函数
- 编译
- sizeof
- main函数接收参数
- 宏函数
- 目标文件和可执行文件有什么
- 强符号和弱符号
- 什么是链接
- 符号
- 强引用和弱引用
- 字符串处理函数
- sscanf
- 查找子字符串
- 字符串指针
- qt
- MFC
- 指针
- 简介
- 指针详解
- 案例
- 指针数组
- 偏移量
- 间接赋值
- 易错点
- 二级指针
- 结构体指针
- 字节对齐
- 函数指针
- 指针例子
- main接收用户输入
- 内存布局
- 内存分区
- 空间开辟和释放
- 堆空间操作字符串
- 内存处理函数
- 内存分页
- 内存模型
- 栈
- 栈溢出攻击
- 内存泄露
- 大小端存储法
- 寄存器
- 结构体
- 共用体
- 枚举
- 文件操作
- 文件到底是什么
- 文件打开和关闭
- 文件的顺序读写
- 文件的随机读写
- 文件复制
- FILE和缓冲区
- 文件大小
- 插入,删除,更改文件内容
- typeid
- 内部链接和外部链接
- 动态库
- 调试器
- 调试的概念
- vs调试
- 多文件编程
- extern关键字
- 头文件规范
- 标准库以及标准头文件
- 头文件只包含一次
- static
- 多线程
- 简介
- 创建线程threads.h
- 创建线程pthread
- gdb
- 简介
- mac使用gdb
- setjump和longjump
- 零拷贝
- gc
- 调试器原理
- c++
- c++简介
- c++对c的扩展
- ::作用域运算符
- 名字控制
- cpp对c的增强
- const
- 变量定义数组
- 尽量以const替换#define
- 引用
- 内联函数
- 函数默认参数
- 函数占位参数
- 函数重载
- extern "C"
- 类和对象
- 类封装
- 构造和析构
- 深浅拷贝
- explicit关键字
- 动态对象创建
- 静态成员
- 对象模型
- this
- 友元
- 单例
- 继承
- 多态
- 运算符重载
- 赋值重载
- 指针运算符(*,->)重载
- 前置和后置++
- 左移<<运算符重载
- 函数调用符重载
- 总结
- bool重载
- 模板
- 简介
- 普通函数和模板函数调用
- 模板的局限性
- 类模板
- 复数的模板类
- 类模板作为参数
- 类模板继承
- 类模板类内和类外实现
- 类模板和友元函数
- 类模板实现数组
- 类型转换
- 异常
- 异常基本语法
- 异常的接口声明
- 异常的栈解旋
- 异常的多态
- 标准异常库
- 自定义异常
- io
- 流的概念和类库结构
- 标准io流
- 标准输入流
- 标准输出流
- 文件读写
- STL
- 简介
- string容器
- vector容器
- deque容器
- stack容器
- queue容器
- list容器
- set/multiset容器
- map/multimap容器
- pair对组
- 深浅拷贝问题
- 使用时机
- 常用算法
- 函数对象
- 谓词
- 内建函数对象
- 函数对象适配器
- 空间适配器
- 常用遍历算法
- 查找算法
- 排序算法
- 拷贝和替换算法
- 算术生成算法
- 集合算法
- gcc
- GDB
- makefile
- visualstudio
- VisualAssistX
- 各种插件
- utf8编码
- 制作安装项目
- 编译模式
- 内存对齐
- 快捷键
- 自动补全
- 查看c++类内存布局
- FFmpeg
- ffmpeg架构
- 命令的基本格式
- 分解与复用
- 处理原始数据
- 录屏和音
- 滤镜
- 水印
- 音视频的拼接与裁剪
- 视频图片转换
- 直播
- ffplay
- 常见问题
- 多媒体文件处理
- ffmpeg代码结构
- 日志系统
- 处理流数据
- linux
- 系统调用
- 常用IO函数
- 文件操作函数
- 文件描述符复制
- 目录相关操作
- 时间相关函数
- 进程
- valgrind
- 进程通信
- 信号
- 信号产生函数
- 信号集
- 信号捕捉
- SIGCHLD信号
- 不可重入函数和可重入函数
- 进程组
- 会话
- 守护进程
- 线程
- 线程属性
- 互斥锁
- 读写锁
- 条件变量
- 信号量
- 网络
- 分层模型
- 协议格式
- TCP协议
- socket
- socket概念
- 网络字节序
- ip地址转换函数
- sockaddr数据结构
- 网络套接字函数
- socket模型创建流程图
- socket函数
- bind函数
- listen函数
- accept函数
- connect函数
- C/S模型-TCP
- 出错处理封装函数
- 多进程并发服务器
- 多线程并发服务器
- 多路I/O复用服务器
- select
- poll
- epoll
- epoll事件
- epoll例子
- epoll反应堆思想
- udp
- socket IPC(本地套接字domain)
- 其他常用函数
- libevent
- libevent简介