Linux下调试器gdb的使用

#include <stdio.h>

int addToTop(int top)
{
    printf("enter addToTop\n");
    int sum = 0;
    for (int i = 1; i <= top; ++i) 
    {
        sum += i;  
    }
    printf("quit addToTop\n");
    return sum;
}

int main()
{
    int top = 100;

    int res = addToTop(top);
    printf("result = %d\n", res);
    
    return 0;
}

Makefile:

test:test.c
		gcc test.c -o test -std=c99
.PHONY:clean
clean:
		rm -f test

Release :
按 gdb test-release 进入调试:
在这里插入图片描述
no debugging symbols found:没有调试信息

而 release 版本是没有调试信息的,没有调试信息就无法调试。

按 quit 退出调试。

在 Linux 中,编译时添加 -g 选项,就是让 gcc/g++ 编译时以 debug 形式编译 。

Debug :

所以修改一下 Makefile :

gcc test.c -o test -g -std=c99

gdb-test-debug 开始调试:
在这里插入图片描述
这时就可以调试了,验证完毕,按 quit 退出调试。

指令集和使用

1、指令集
/ 代表的就是或者,比如 list / l 就是两者都可以,后一个通常为简写,一般使用简写。

gdb file :开始调试
list/l 行号:显示源代码,接着上次的位置往下列,每次列10行。list 通常简写为 l 。
list 0/1 :从源代码的第一行开始显示代码,每次列 10 行
list/l 函数名:列出某个函数的源代码,10行
r / run:运行程序,类似于 vs 上的 f5 ,如果有断点就停在第一个断点处,否则直接执行程序
n / next:单条执行。也被叫做 逐过程 ,和 vs 上的 f5 一样,遇到函数会直接把函数执行完
s /step:进入函数调用。也被叫做 逐语句 ,按住会进入函数,包括库函数
break / 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info breakpoints/break/b :查看断点信息,查看的断点以编号形式排布,从 1 开始。
finish:执行到当前函数返回,然后停下来等待命令
print / p:打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值,类比于短暂监视窗口
set var:修改变量的值。常用语循环,比如跳转到第 n 次循环
continue / c:从当前位置开始连续而非单步执行程序。说白了就是从一个断点处,直接运行到下一个断点处,类比于 vs 上的 f5 在断点进行跳转
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为 n 的断点
disable breakpoints:禁用断点,改变断点使能
enable breakpoints:启用断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值(监视窗口常显示)
undisplay 编号:取消对先前设置的那些变量的跟踪,若使用 undisplag 则全部取消
until 行号:在函数内进行指定位置跳转,执行完区间代码
breaktrace / bt:查看各级函数调用及参数。说白了就是查看调用链
info / i locals:查看当前栈帧局部变量的值
quit:退出gdb调试

2、演示
list / l :显示内容
在这里插入图片描述
断点操作 :

b 行号 和 b 函数名:打断点
在这里插入图片描述
info breakpoints/break/b :查看断点信息
在这里插入图片描述
解释:

num:断点编号,从 1 开始
enb:代表着断点使能。y代表打开;n代表关闭
what:说明断点是什么,在哪个函数中,在哪个文件,第几行。

过渡步骤:运行 r 跳转到断点,在断点处停下来

此刻 info b 查看断点信息:
在这里插入图片描述
显示信息:breakpoint already hit 1 time 代表断点命中一次

d break 可以删除所有断点,同理 d breakpoints 和 break breakpoints 也都对
删除时会询问是否删除,y 代表 yes ,n 代表 no

disable b num :关闭断点使能 enable b num :打开断点使能
在这里插入图片描述
分别显示了断点打开和关闭的过程
info b :可以直接关闭所有的断点使能
这一过程就像 vs 上设置空断点一样

info :查看 info 可以查阅的信息
在这里插入图片描述

逐过程和逐语句 :

next/n :逐过程,一步可以走掉一个函数,相当于 vs 中的 f10
在这里插入图片描述

一次走过了函数,函数中打印的内容也会显示出来
还会显示当前行数,以及当前行的内容

s :逐语句,一次走一条代码,可进入函数,同样的库函数也会进入
在这里插入图片描述

调用一个函数,就要把函数调用的数据进行压栈
调试位置变成整个代码的第一行
addToTop函数第一行为整个程序的第五行
显示行号和内容

bt :查看调用链
在这里插入图片描述

看到一个函数调用的过程,压栈的过程,main函数在栈底,addtotop就像被压栈了,被压到栈顶

查询数据和常显示数据:

p 变量名/地址:暂时查询变量
在这里插入图片描述

使用完该指令之后,会给变量一个对应的编号
这个数据只是短暂显示,下次执行指令会消失

display 变量名:常显示变量的数据
在这里插入图片描述

常显示变量数据,类似于 vs 中的监视窗口,display 显示的数据伴随着调试过程一直存在
且会按照 display 的顺序给上相应的编号,显示为倒序显示

undisplay 编号 :取消变量的显示
在这里插入图片描述

undisplay 取消显示后,每次执行不会显示刚刚取消的变量

until 行号:不打断点,在函数内进行指定位置跳转,执行完区间代码
在这里插入图片描述

刚刚还在执行循环中的内容,使用 until 直接跳转到 11 行,把循环执行完毕

finish:执行到当前函数返回,然后停下来等待命令

假设当前已经进入行数,想要直接跑完这个函数,函数中没有任何断点,跑完之后就停下来:
在这里插入图片描述

这样就直接跑完了函数,并显示了返回结果
再次 n 就是返回主函数,并执行完调用函数的语句,返回下一行

continue / c:从一个断点处,直接运行至下一个断点
在这里插入图片描述

跳转到下一个断点处,并把跳转过程中打印的内容显示出来

set var :修改变量的值,很适用与循环跳转到指定循环次
在这里插入图片描述

在循环中使用 set var i=100 ,直接跳转到 i=99 时的循环次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值