Linux下调试器GDB、makefile的使用

前面的几篇博客中我们讲解了Linux下的编辑器vim、编译器gcc和g++,今天我们来介绍一下其他常用的三种工具,它们分别是程序调试器:GDB、代码查看器:ctags、还有一个辅助工程的工具:Makefile


程序调试器:GDB

在windos下我们常用vs编辑器中自带的调试工具进行程序的调试,对于程序员来说,调试自己写的程序时必须的;在Linux中,我们可以使用GDB来调试已经编译好的可执行程序;注意,一定是已经编译好的程序,下面来看看GDB使用调试的注意事项以及相关按键:
这里写图片描述

  1. 如上图,首先用gdb调试的可执行程序文件必须含有相应的调试信息,在用gcc编译时我们需要在gcc指令的后面加上-g标志,在下面的信息中,下面的文件大小中含有调试信息的文件的大小是比不含调试信息的文件要大。
  2. 下面,我们使用 gdb + 含有调试信息的可执行程序进入调试阶段,如下图:
    这里写图片描述
  3. 在开始单步执行时我们必须要先打上断点,因为我们在单步执行之间必须先运行程序,如果不打上断点,程序会直接跑完,这时非常尴尬的。
    这需要我们记住gdb的两个指令:
    r : 开始运行程序
    b + n:表示在第n行打下断点(n为数字)
    这里写图片描述

下面我们就可以来调试程序了,调试程序的过程中,我们需要记住几个最基本的指令:
n:单步执行程序
s:跳转到函数的入口地址
p:打印变量的值
我们来通过一次调试看看这些命令是如何使用的:
这里写图片描述

其他的一些重要命令

display + 变量名:将该变量的内容常显示,即在变量的作用域中每次单步执行都会看到该变量的内容,对我们观察变量的内容的改变情况十分有帮助.
undisplay + n:取消显示列表中的号码n所对应的变量内容的常显示。
这里写图片描述

set var x=n:将变量x的内容修改为n,这样做可以辅助我们调试程序,比方说我们先看到start=8;end=8;时程序的执行结果,我们就可以通过该命令直接修改变量的内容,这样可以使我们少单步执行几次程序就能得到我们想看到的结果。
这里写图片描述

关于断点除了前面的几条命令外还有下面几条比较重要的命令:

info b num:查看第num个编号的断点的当前信息
info b:查看所有断点的信息
delete breakpoints:删除所有断点
delete breakpoints num:删除序号为num的断点
disable num:禁用序号为num的断点
enable num :启用序号为num的断点

下面我们来看看这些命令的使用:

这里写图片描述

其他有助于调试的命令

continue :从当前位置继续向后执行而不是单步执行程序。
finish 执行完当前函数返回,然后原地“踏步”等待命令。
until n:直接跳转至第n行


Makefile

一个程序员会不会写Makefile,决定了这个程序员具不具备在Linux下完成大型工程的能力,因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual
C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

首先,我们来实现一个简单的Makefile,顺便讲解一下Makefile的语法。
场景如下
在一个文件夹下面,我们已经写好了头文件,函数文件,以及测试文件,如果我们将函数文件和测试文件都进行编译并且我们需要查看编译过程中各个阶段所生成的文件,那样我们需要敲好多条命令,如果我们改写了函数文件或者测试文件的程序,那么这些步骤需要再来一次,这样会很繁琐,而当我们编写好了Makefile文件后,这些指令统统只需要一个make就能够搞定,下面我们来看一个简单的Makefile的实现:
这里写图片描述

target : preproity
/Tab command
上面的命令是Makefile的基本语法,target可以是文本文件,也可以是可执行文件,还可以是一个标签,这种标签就相当于上图中的伪指令clean,它没有preproity这一项。
target文件的生成规则定义在解决方法command中,如果target比preproity文件的时间要新的话则会执行command,否则会继续向上查找preproity的依赖文件,直到找到符合规则,并且最新的为止。这是Makefile的主线和核心,大家如果想深入了解的可以去看看下面这篇博客:
http://blog.csdn.net/ruglcc/article/details/7814546/

关于C语言和C++语言的编译这个过程,大家可以看看下面这篇博客:
http://blog.csdn.net/bit_clearoff/article/details/53965514

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux使用gdb调试的步骤如下: 1. 编译程序时需要加上-g选项,以便在调试时能够获取到符号表信息。 2. 在终端中输入gdb命令,进入gdb调试环境。 3. 使用file命令加载要调试的可执行文件。 4. 使用break命令设置断点,可以在函数名、行号等位置设置断点。 5. 使用run命令运行程序,程序会在断点处停止。 6. 使用print命令查看变量的值。 7. 使用step命令单步执行程序。 8. 使用continue命令继续执行程序。 9. 使用backtrace命令查看函数调用栈。 10. 使用quit命令退出gdb调试环境。 以上是Linux使用gdb调试的基本步骤,需要根据具体情况进行调整和扩展。 ### 回答2: GDB是一种GNU项目中的调试工具,它在Linux系统中被广泛使用GDB可以帮助程序员调试他们的应用程序,找出程序中的错误和问题。本文将介绍如何在Linux系统中使用GDB调试程序的步骤。 第一步:编译程序时添加-G选项 GDB需要可执行文件中有调试信息,因此我们需要在编译时添加-G选项: ``` gcc -g -o program program.c ``` 这将生成一个带有调试信息的可执行文件。 第二步:启动GDB 在终端中输入以下命令启动GDB: ``` gdb program ``` 这将启动GDB并加载程序。 第三步:设置断点 在调试程序之前,我们需要先设置断点。断点是一种标记,它告诉GDB在其中断程序的执行,以便程序员检查执行状态。 要设置断点,可以执行以下命令: ``` break function_name ``` 这会在函数function_name的第一行设置一个断点。 分析断点: ``` 1. b/break [行号] 行号是在源文件中的。例如:b 17, 在17行处设置断点。 2. watch 用于监视变量。例如:watch p, 如果p变量发生变化,则停下来。 3. r/run 这个命令可以执行程序,并在遇到下一个断点前停止程序的执行。 4. step “单步调试”,通过跳入处理函数中来观察变量值的变化。 5. n/next “单步过”,通过跳出处理函数中来观察变量值的变化。 6. c/continue “继续”,重新运行程序并且停在下一个断点。 ### 回答3: GDB是一款功能强大的调试器,它可以用于调试C、C++等编程语言的程序。在Linux中,使用GDB调试程序的过程如下: 1. 编译程序时需要加上调试信息,如-g参数。例如,编译C程序时可以使用以下命令: ``` gcc -g -o program program.c ``` 这将生成一个带有调试信息的可执行文件。 2. 启动GDB。在终端中输入以下命令: ``` gdb program ``` 其中program是要调试的可执行文件名。 3. 设置断点。使用break命令设置断点,例如: ``` break main ``` 这将在程序的main函数处设置一个断点。 4. 运行程序。使用run命令来运行程序,例如: ``` run ``` 程序将在断点处暂停执行,等待命令。 5. 查看变量值。使用print命令查看变量的值,例如: ``` print x ``` 这将显示变量x的值。 6. 单步执行。使用step命令进行单步执行,例如: ``` step ``` 这将执行当前指令,并暂停在下一条指令处等待命令。 7. 继续执行。使用continue命令继续执行程序,例如: ``` continue ``` 程序将一直运行,直到遇到下一个断点或程序结束。 8. 删除断点。使用delete命令删除已设置的断点,例如: ``` delete 1 ``` 这将删除编号为1的断点。 以上就是在Linux使用GDB调试程序的基本步骤。当然,GDB还有很多高级功能和命令,需要更深入的学习和了解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值