您的位置:首页 > 其它

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常用命令:

简写全称备注
listlist显示指定行号或者指定函数附近的源代码
bbreak在指定行号或者指定函数开头处设置断点。 如b main
rrun运行程序,直到程序结束或者遇到断点而停下
ccontinue在程序中断后继续执行程序,直到程序结束或者遇到断点而停下。 注意在程序开始执行前只能用r,不能用c
nnext执行一条语句。 如果有函数调用,则把它作为一个整体
sstep执行一条语句。 如果有函数调用,则进入函数内部
uutil执行到指定行号或者指定函数的开头
pprint显示变量或表达式的值
dispdisplay把一个表达式设置为display, 当程序每次停下来时都会显示其值
clclear取消断点,和b的格式相同。 如果该位置有多个断点,将同时取消
iinfo显示各种信息。 如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命令,参考上图

(暂时运行到这)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: