gdb 调试详解与实战


1.简介

GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。

官方说明文档:https://sourceware.org/gdb/current/onlinedocs/gdb/

在实际应用中,有两种调试方法:在线调试和离线调试。
离线调试适用于开发测试环境,可以自由启停进程,设置断点;在线调试一般用于现场问题分析,不能随便启停进程,对于技术要求较高。

2.GDB启动配置

2.1 服务器启动GDB配置

如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置:

#设置core大小为无限
ulimit -c unlimited
#设置文件大小为无限
ulimit unlimited

2.2 代码编译设置

若想执行GDB调试,需要在Makefile中添加编译调试选项-g,例如:

gdb dup_file.c –o dum_file_elf –g –lpthread -O0
  • -g2 作用是在可执行文件(ELF)中加入源代码的相关信息,比如ELF中第几条机器指令对应源代码的行数。
    -g的完整格式是-glevel,其中level中指定了调试信息中包含了调试信息的多少,默认的是2,level=1最少,level=3最多(包括宏定义等信息)。
  • -O2 作用是让编译器自动优化我们的代码
    -O有4个级别,-O0编译不优化,一般是推荐-O2,设置了-O2后,编译器会试图提高代码性能而不会增大体积和大量占用的编译时间。
O级别说明
O0不做任何优化
O1做部分优化,对于大函数,优化编译占用较多的时间和相当大的内存,使用本优化,编译器会尝试减小生成代码的尺寸,并缩短生成时间,单并不执行需要占用大量编译之间的优化
O2比O1更高级的选项,进行更高级的优化,GCC将执行机会所有空间和时间折中的优化,与O1比较而言,O2在优化了编译时间的基础上提高了代码执行效率
O3O2的基础上打开了更多的优化选项

3.基本用法

3.1 GDB常用命令操作

文件<文件名>加载调用的可执行文件示例
gdb进入调试程序在这里插入图片描述
run重新开始运行文件在这里插入图片描述
start单步执行,运行程序,停在第一执行语句在这里插入图片描述
list查看源码,简写l在这里插入图片描述
print打印指针、变量的值在这里插入图片描述
set设置变量的值在这里插入图片描述
next单步调试(逐过程,函数直接执行),简写n在这里插入图片描述
step单步调试(逐语句,跳入自定义的函数内部执行),简写s在这里插入图片描述
backtrace查看函数调用的栈帧和层级关系,简写bt在这里插入图片描述
frame切换函数的栈帧在这里插入图片描述
info查看函数内部局部拜年的数值,简写i在这里插入图片描述
finish结束当前函数,返回调用点在这里插入图片描述
continue继续运行,简写c在这里插入图片描述
quit退出gdb调试,简写q在这里插入图片描述

3.2 查看文件是否带有调试功能

3.2.1 执行:gdb 程序名

如果带有如下提示信息,则说明程序带有调试功能
在这里插入图片描述

3.2.2 使用命令:readelf -S main|grep debug

在这里插入图片描述
如果有debug说明有调试功能,如果没有debug。说明没有带有调试功能,则不能被调试。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良缘白马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值