gdb简单学习
2016-12-17 21:57
239 查看
gdb简单学习
编译环境:MinGW示例程序:
//新建test.cpp交换两个整数的值 //error function void swap1(int a, int b) { int temp = a; a = b; b = temp; } int main() { int a = 3, b = 4; swap1(a, b); printf("%d %d\n", a, b); return 0; }
gdb常用命令:
简写 | 全称 | 备注 |
---|---|---|
list | list | 显示指定行号或者指定函数附近的源代码 |
b | break | 在指定行号或者指定函数开头处设置断点。 如b main |
r | run | 运行程序,直到程序结束或者遇到断点而停下 |
c | continue | 在程序中断后继续执行程序,直到程序结束或者遇到断点而停下。 注意在程序开始执行前只能用r,不能用c |
n | next | 执行一条语句。 如果有函数调用,则把它作为一个整体 |
s | step | 执行一条语句。 如果有函数调用,则进入函数内部 |
u | util | 执行到指定行号或者指定函数的开头 |
p | 显示变量或表达式的值 | |
disp | display | 把一个表达式设置为display, 当程序每次停下来时都会显示其值 |
cl | clear | 取消断点,和b的格式相同。 如果该位置有多个断点,将同时取消 |
i | info | 显示各种信息。 如i b显示所有断点,i disp显示display,而i lo显示所有局部变量 |
1.译程序,命令行输入:
g++ test.cpp -g //-g参数是告诉编译器生成调试信息,得到a.exe
2.开始gdb调试,输入命令:
gdb a.exe
3.查看源码,命令:
list(简写l), list n:显示第n行附近的几行代码,一般显示10行, 命令详细信息可以使用help name(list, break, ...)查看
启动gdb的时候可以加-tui参数来查看到源代码:
gdb -tui a.out//这个有点6了,在windows试了下不支持TUI mode,于是在Linux环境下:
4.设置断点,运行程序,命令:
b(break) n:在程序的第n行设置断点,当程序运行到第n行是暂停; r(run)开始运行程序
5.使用p打印变量a, 和 b,发现a和b输出都是4,所以设置第7行断点处没有执行
6.使用bt(backtrace)命令查看调用栈信息,两条栈帧信息swap1, main,函数调用会将相关信息入栈,函数结束可以将相关信息出栈,每一条栈帧对应一个未运行完成的函数
7.使用s(step)命令执行一条语句,n(next)也是执行下一步,区别如参考gdb常用命令表,这时b = temp, 执行完毕,p a 和 p b输出3 4,然后在s执行一条语句,完成swap1函数的执行,调用栈swap1栈帧信息出栈,这时bt查看调用栈信息,只有main函数调用信息
8.continue命令,参考上图
(暂时运行到这)
相关文章推荐
- Mongodb简单安装
- mysql与oracle常用函数及数据类型对比00持续补充
- CComObjectBase 和IUnknown 接口
- 理解伪元素 :before 和 :after
- 欢迎使用马克飞象
- C# Bitmap类型与Byte[]类型相互转化
- Struts2中Action接收参数的方法主要有以下三种:
- array_multisort 关联(string)键名保持不变,但数字键名会被重新索引。
- tshark抓包小结
- 轻松理解CRC差错检测算法(A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS)七
- putchar()与getchar()
- pip安装python库时候出现http异常
- 自定义注解
- 【Spring】XML配置整合Mybatis
- 旅行家的预算 1999年NOIP全国联赛普及组NOIP全国联赛提高组
- JavaMail
- Unity实现自己的简易游戏窗口管理器
- SVM算法下如何使用SMO算法优化拉格朗日乘子
- DexHunter的原理分析和使用说明(一)
- exit()和_exit()的区别