Linux gdb调试基础

gdb调试器是GNU开源组织发布的针对unix和linux操作系统,基于命令行的程序调试工具。gdb不像windows开发环境的图形界面调试工具,不过在linux系统下面gdb调试工具可谓是调试利器。

gdb主要功能有下面几个方面:

1.启动程序,可以按照你自己的想法和要求随心所欲的运行你的程序 2. 被调试的程序可以在你指定的调试断点处停止 3. 在程序停止期间,你可以检查你的程序中发生的所有事情 4. 动态改变程序的执行环境

在使用gdb之前,我们需要明白一点,只有带有调试信息的可执行文件才能够为我们所用。在windows程序中,就是debug模式和release模式的区别。

回想一下,前面我们也提到过,在编译的时候使用-g选项就可以生成可供调试的可执行文件。

gdb的命令很多,我们可以通过 man gdb来简单了解一下

当然了,如果小伙伴们不习惯这种命令行的方式,大家也可以使用界面调试工具。前面我也提到过使用NetBeans来开发linux程序,使用NetBeans调试程序可以让我们很方便的使用调试工具,这点看大家喜好。

不过很多时候估计我们使用图形界面都是一种奢求,所以gdb的基础知识我们还是有必要学习一下。

加载可执行文件 在gdb调试模式下,我们可以使用 file [可执行文件]来加载要调试的可执行文件。

首先,我们需要创建一个c++源文件供我们后续使用。

这里我们创建名为gdb-test.cpp的文件:

#include <iostream>

using namespace std;


int main (){
  cout << "line 1" << endl;
  cout << "line 2" << endl;
  cout << "line 3" << endl;
  cout << "line 4" << endl;
  cout << "line 5" << endl;
  return 0;
}
复制代码

接下来我们需要编译出带调试信息的可执行文件:

g++ -g gdb-test.cpp -o gdb-test
复制代码

此时目录下有以下文件:

启动gdb,加载可执行文件:

此时我们的前期工作就准备好了。

list命令查看源代码 list命令用来显示源代码,可以使用缩写的l,并且可以使用参数:

大家可以看到在不使用参数的情况下,list命令默认只会显示10行代码,想想也有道理,再多我们看起来就不太舒服了。再次输入list命令会从上面显示的末行的下一行开始显示。

list后面带一个参数,是数字哦。此时代表的意思是显示当前n行前面的5行和后面的4行。

list带两个参数:

list/l n1,n2
复制代码

数字之间使用逗号分隔。

此时n1代表要显示的源代码的起始行数,n2代表结束行数。

这里还有一种操作我们也得知道,就是使用list+函数名来显示该函数上下的10行代码:

使用run命令运行程序 既然我们是调试程序,让程序跑起来才是最重要的事情。这里我们可以使用run命令来实现。

run命令可以向程序传递参数,如果参数有多个,那么使用空格分隔即可。当然了,run的缩写是r。

前面我们使用的源代码没有参数,这里我们完善一下代码:

此时我们运行程序:

惊不惊喜,意不意外,是不是以为输出是没有参数呢?

第一个参数argc,指明有多少个参数将被传递给主函数main(),真正的参数以字符串数组(即第2个参数argv[])的形式来传递。argc代表参数的数量, 可执行程序是作为第一个参数传递的,实际上我们想的参数是从argv[1]开始的。

接下来我们在gdb中传递参数:

run 参数1 参数2 ......
来向可执行文件传递参数,使用show args命令可以查看传递给main函数的参数。

复制代码
如果我们使用run向main传递了参数,那么你会发现下次使用run命令时,
你没有设置参数,但是run命令会自动使用上次传递的参数。   
要改变传递的参数,我们需要使用set args 参数的形式来设置。
复制代码

当然了,我们每次直接带参数就不会有这样的问题了。

设置断点

使用break简写b来设置程序断点,常见的方式有一下两种: 1、通过行号来设置断点 b 行号 2、通过函数名称来设置断点 b 函数名

其他用到的命令这里在演示几个吧

转载于:https://juejin.im/post/5ca5e192f265da30be228f0e

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值