前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux】Linux调试器--gdb的使用

【Linux】Linux调试器--gdb的使用

作者头像
举杯邀明月
发布2023-04-12 18:56:08
3.6K0
发布2023-04-12 18:56:08
举报
文章被收录于专栏:C++&linux


一、gdb的介绍

1. gdb是linux上面的调试器,是非图形化界面纯命令行调试的,用起来非常的麻烦!

2. 安装gdb工具的命令

代码语言:javascript
复制
sudo yum install -y gdb

3. 默认情况下,gdb无法进行对gcc现在发布的程序进行调试,因为gcc默认生成的软件是realease版本的,没有调试信息,无法被调试器gdb调试,并且gcc是默认动态链接的,如果想静态链接还需要加static选项,所有gcc是有两种默认行为的。

4. gcc编译时添加-g选项可以使得gcc发布的程序软件为debug版本,这样就可以通过gdb对程序进行调试

代码语言:javascript
复制
mytest_g:mytest.c
	gcc mytest.c -g -o mytest_g
	
.PHONY:clean
clean:
	rm -f mytest_g

二、debug和realease版本的区别

1. debug是给程序员用的版本,添加了调试信息,用于解决软件或程序中出现的问题,realease是发行给客户使用的版本,并未添加调试信息,只需要给客户提供优越的产品使用环境即可,至于是否能够debug调试,这是程序员才应该关心的主要问题。

2. 可以看到debug版本的字节大小是要大于realease版本的,这是因为其中添加了调试信息。

3. 通过指令可以读取可执行程序的二进制构成,显示出具体的二进制软件的内部所形成的特定格式。 值得注意的是:每一个二进制程序不仅仅只是一堆二进制代码,他们内部都是有特定格式的,Linux中形成的可执行程序是elf格式。 想要了解elf格式的可以去看看 深入了解计算机系统这本书

代码语言:javascript
复制
[wyn@VM-8-2-centos test_dir]$ readelf -S mytest_g | grep debug

下面就是debug中所添加的调试信息,而realease版本是没有这些调试信息的

三、gdb的使用

1.显示代码: l+行号(list)指令

gdb会默认记住历史上曾经输入的指令,l+0输入后gdb会从第零行开始显示部分的代码,我们继续回车便可以显示后半部分的代码,直到显示完停止

2.设置断点: b+行号(breakpoint)

3.查看断点: info b

4.取消断点: d + 断点编号

5.调试运行:r(run)

vs2022环境: 1.运行调试:fn+f5如果有断点,就停下来,如果没有断点就直接运行起来,如果想要跳到下一个断点,可以继续按fn+f5 2.取消调试:fn+shitf+f5 3.直接运行:fn+crtl+f5直接运行,有断点也不会调试

linux环境 1.直接运行:./+二进制可执行程序 2.调试运行:run

6.逐过程:n(next)

7.逐语句:s(step)

8.运行至下一个断点处:c(continue)

9.查看函数调用堆栈:bt

10.直接运行完当前函数,然后返回到调用地方:finish

11.临时查看变量或地址的值:p + 变量或地址

12.监视跟踪查看/取消监视跟踪查看:display/undisplay

13.跳转到指定行:until+行号

可以利用until来跳出循环

14.修改变量的值:set var

15.查看当前栈帧局部变量的值:info locals

16.禁用/启用断点:disable/enable 断点编号

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、gdb的介绍
  • 二、debug和realease版本的区别
  • 三、gdb的使用
    • 1.显示代码: l+行号(list)指令
      • 2.设置断点: b+行号(breakpoint)
        • 3.查看断点: info b
          • 4.取消断点: d + 断点编号
            • 5.调试运行:r(run)
              • 6.逐过程:n(next)
                • 7.逐语句:s(step)
                  • 8.运行至下一个断点处:c(continue)
                    • 9.查看函数调用堆栈:bt
                      • 10.直接运行完当前函数,然后返回到调用地方:finish
                        • 11.临时查看变量或地址的值:p + 变量或地址
                          • 12.监视跟踪查看/取消监视跟踪查看:display/undisplay
                            • 13.跳转到指定行:until+行号
                              • 14.修改变量的值:set var
                                • 15.查看当前栈帧局部变量的值:info locals
                                  • 16.禁用/启用断点:disable/enable 断点编号
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档