【Linux】工具(5)——gdb

2023-10-27

今天我们来到Linux工具的最后一篇博客:gdb的使用

目录

一、Linux下的release和debug

二、gdb常用指令选项


一、Linux下的release和debug

我们先来写一个Makfile,来方便我们编译代码:

再来写一个test.c的源文件:

接着我们使用make来编译一下源文件:
编译
可以看到编译没有通过
这是因为当前gcc编译的标准不支持在for循环中定义变量,但是我们可以在gcc指令后面加上-std=c99就可以按照c99的标准来编译代码:

 接着我们再使用make来编译一下:

 

 编译完成生成了运行文件,我们来运行一下:

 光运行已经不能满足我们了,我们需要进行调试,这时就轮到gdb上场了,具体使用方法:

gdb  要调试的可执行文件

我们现在试了一下,发现并不能正常调试,主要是缺少了调试信息:

这是因为在Linux环境下gcc/g++默认编译的代码是release版本

debug版本:程序本身会被加入更多的调试信息 以便于进行调试

release版本:不会添加任何调试信息 是不可调试的

我们在linux中默认生成的文件都是release版本的 是不可以使用gbd调试的

如果我们想要它可被调试则需加入debug信息

具体指令如下:

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

 即在gcc指令上加上-g选项即可(表示生成debug版本的可执行程序)

我们可以发现debug版本的可执行程序比release版本的可执行程序大一些,这是因为debug版本的含有调试信息

下面我们再来使用gdb进行调试:

 这时就成功了

二、gdb常用指令选项

【l 行号】:显示binFile源代码,接着上次的位置往下列,每次列10行。

【l 函数名】:列出某个函数的源代码。

【r】:从头开始连续而非单步执行程序

【n】:单条执行

【s】:进入函数调用

【c】:从当前位置开始连续而非单步执行程序

【b 行号】:在某一行设置断点

【b 函数名】:在某个函数开头设置断点

【info b】 :查看所设置的断点信息

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

【p 变量名】:打印变量值

【set variable 变量名】:修改变量的值

【delete breakpoints】:删除所有断点

【delete breakpoints n】:删除序号为n的断点

【disable breakpoints n】:禁用序号为n的断点(禁用后该断点不起作用,但并没有删除)

【enable breakpoints n】:启用序号为n的断点

【display 变量名】:跟踪查看一个变量,每次停下来都显示它的值(变量常显示)

【undisplay 变量名】:取消对先前设置的那些变量的跟踪

【until 行号】:运行至所给行号处停下

【bt】:查看各级函数调用及参数

【info locals】:查看当前栈帧局部变量的值

【q】:退出gdb


感谢各位的阅读,我们下一期见

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】工具(5)——gdb 的相关文章

  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 如何从程序内部获取指向程序的特定可执行文件部分的指针? (也许是诽谤)

    我在 Linux 环境中 需要编写一个程序来检索放置在其可执行文件的某个部分中的一些数据 那么 如何从程序内部获取指向程序某个部分 通过其名称 的指针呢 我知道可以使用elf getdata 将节的索引作为参数传递给 get 和Elf Da
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • 隐式声明“gets”

    据我所知 隐式声明 通常意味着该函数必须在调用之前放置在程序的顶部 或者我需要声明原型 然而 gets应该在stdio h文件 我已包含 有没有什么办法解决这一问题 include
  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • Linux 中有没有一种轻量级的方法来获取当前进程数?

    我希望我的 基于 C C 的 程序显示一个数字指示器 指示本地系统上当前有多少个进程 将经常查询正在运行的进程数值 例如每秒一次 以更新我的显示 有没有一种轻量级的方法来获取该数字 显然我可以调用 ps ax wc l 但我不想强迫计算机生
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规
  • 通过名称获取进程ID

    我想在 Linux 下获得一个给定其名称的进程 ID 有没有一种简单的方法可以做到这一点 我还没有在 C 上找到任何可以轻松使用的东西 如果追求 易于使用 char buf 512 FILE cmd pipe popen pidof s p
  • Linux 中的 Windows NAmed Pipes 替代品

    我们正在将现有的 Windows 代码移植到 Linux 我们使用 ACE 作为抽象层 我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作 linux 下这个相当于什么 我检查了linux命名管道 FIFO 但它们似乎只支
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • 每个虚拟主机的错误日志?

    在一台运行 Apache 和 PHP 5 的 Linux 服务器上 我们有多个带有单独日志文件的虚拟主机 我们似乎无法分离 phperror log虚拟主机之间 覆盖此设置
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • X 按键/释放事件捕获,与焦点窗口无关

    我想记录所有传入的按键事件 无论哪个窗口处于焦点状态或指针位于何处 我编写了一个示例代码 它应该捕获当前焦点窗口的按键事件 include
  • Flex 的远程版本误解了我的规则

    我使用 flex 和 bison 编写了一个小汇编程序 可以在我的机器 ubuntu 10 10 上构建并运行正常 现在其他人正在尝试在 arch linux 上构建它 并且他们安装的 flex 产生了不同的 lex yy c 这是不匹配的
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • 路由是否会影响具有绑定源地址的套接字?

    假设我有两个网络接口 eth0有地址10 0 0 1 eth1有地址192 168 0 1 Using route or ip route add我已将其设置为路由 所有地址至eth0 1 2 3 4只为了eth1 所以数据包到1 2 3
  • 在bash中用其他文件过滤一个文件

    我有一个带有数字的文件 例如 cat file 31038467 32048169 33058564 34088662 35093964 31018168 31138061 31208369 31538163 31798862 和其他例如
  • 如何获取 bash 中从 Ping 接收到的数据包的百分比?

    当 ping 主机时 我希望输出仅显示收到的数据包 已发送 5 个 的百分比 我想我需要使用grep不知怎的 但我不知道如何 我是 bash 编程的新手 这是我所在的地方 ping c 5 q host grep grep 中应该包含什么
  • SVN 不断提示我输入密码并拒绝缓存我的凭据

    环境 Eclipse Indigo Ubuntu 11 04 Subclipse 1 6 SVN 客户端 Subclipse RabbitVCS 我通过 svn ssh 连接 我的网址如下所示 svn ssh 我的名字 我的域名 路径 我可

随机推荐