gdb简单学习

来源:互联网 发布:win7安装mac os10.11 编辑:程序博客网 时间:2024/05/16 02:49

gdb简单学习

编译环境:MinGW

示例程序:

//新建test.cpp交换两个整数的值//error functionvoid 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 print 显示变量或表达式的值 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
进入gdb
3.查看源码,命令:list(简写l), list n:显示第n行附近的几行代码,一般显示10行, 命令详细信息可以使用help name(list, break, ...)查看
这里写图片描述

help list
启动gdb的时候可以加-tui参数来查看到源代码:
gdb -tui a.out//这个有点6了,在windows试了下不支持TUI mode,于是在Linux环境下:
gdb -tui
4.设置断点,运行程序,命令:b(break) n:在程序的第n行设置断点,当程序运行到第n行是暂停; r(run)开始运行程序
G3
5.使用p打印变量a, 和 b,发现a和b输出都是4,所以设置第7行断点处没有执行
G4
6.使用bt(backtrace)命令查看调用栈信息,两条栈帧信息swap1, main,函数调用会将相关信息入栈,函数结束可以将相关信息出栈,每一条栈帧对应一个未运行完成的函数
G5
7.使用s(step)命令执行一条语句,n(next)也是执行下一步,区别如参考gdb常用命令表,这时b = temp, 执行完毕,p a 和 p b输出3 4,然后在s执行一条语句,完成swap1函数的执行,调用栈swap1栈帧信息出栈,这时bt查看调用栈信息,只有main函数调用信息
G6
8.continue命令,参考上图

(暂时运行到这)

0 0
原创粉丝点击