一文说清楚Linux gdb

以下是关于 GDB(GNU Debugger) 的详细介绍:

  1. 什么是 GDB?
    定义
    GDB(GNU Debugger)是 GNU 项目开发的一款功能强大的调试工具,用于调试 C、C++、Fortran 等语言编写的程序。它允许开发者执行程序时进行断点设置、内存检查、调用栈跟踪等操作。

功能
调试程序:
检测程序运行中的错误。
分析程序崩溃原因。
跟踪执行流程:
步进调试(逐行执行)。
跟踪函数调用关系。
变量与内存检查:
查看变量值和内存地址。
修改变量值以观察其影响。
核心转储分析:
分析程序崩溃时生成的核心转储(core dump)文件。
动态库调试:
支持调试链接了共享库的程序。
2. GDB 的使用方法
基本工作流程
编译程序: 使用 -g 编译选项生成带调试信息的程序:

gcc -g -o myprogram myprogram.c
启动 GDB: 加载调试目标程序:

gdb ./myprogram
设置断点:
在指定函数设置断点:

break main
在指定行号设置断点:

break myprogram.c:15
运行程序:

run
调试命令:
单步执行:

step # 进入函数
next # 不进入函数
查看变量:

print var_name
查看内存:

x/10x &var_name # 查看变量内存地址处的内容
调用栈查看:
打印当前调用栈:

backtrace (或 bt)
切换到特定栈帧:

frame [n]
3. 解决 bt 打印栈地址为空的问题
调用 bt 打印调用栈时,可能会出现 空调用栈 的问题。以下是常见原因和解决方法:

原因 1:没有调试信息
如果程序未编译为带有调试信息的格式,GDB 无法生成栈信息。

解决方法:
重新编译程序,添加 -g 编译选项:

gcc -g -o myprogram myprogram.c
原因 2:优化级别过高
编译器的高优化级别(如 -O2 或 -O3)可能会内联函数或移除部分信息,使栈信息缺失。

解决方法:
在编译时降低优化级别,使用 -O0:

gcc -g -O0 -o myprogram myprogram.c
原因 3:内存损坏或栈被破坏
程序在运行过程中可能由于非法指针操作或溢出,导致栈结构损坏。

解决方法:
启用地址/内存检查工具,如 valgrind,结合 GDB 调试:

valgrind --vgdb=yes ./myprogram
检查可能导致内存破坏的代码段。
原因 4:核心转储文件不完整
如果调试的是 core dump 文件,可能因为生成文件时未启用完整的核心转储功能。

解决方法:
检查核心转储限制:

ulimit -c
如果显示为 0,则启用核心转储:

ulimit -c unlimited
再次运行程序生成 core dump 文件。
原因 5:动态库符号未加载
如果程序使用动态库,GDB 可能未加载库的符号。

解决方法:
在 GDB 中手动加载符号:

set solib-search-path /path/to/library
或者使用 ldd 查看程序依赖库,确保库路径正确。

  1. 高级功能
    调试多线程程序
    查看所有线程:

info threads
切换到指定线程:

thread [thread_id]
条件断点
设置满足条件时才触发的断点:

break myprogram.c:15 if var_name > 0
动态调试动态库
动态加载符号:

set stop-on-solib-events 1
5. GDB 的常用命令总结
在这里插入图片描述

总结
GDB 是开发和调试 C/C++ 等语言程序的强大工具,掌握其基本和高级功能对于提高开发效率至关重要。如果调用栈信息为空,通常是因为调试信息缺失或栈被破坏。针对这些问题,合理设置编译选项、分析程序运行状态,并结合其他工具(如 valgrind)可有效解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/2060.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

api开发及运用小红书笔记详情api如何获取笔记详情信息

item_get_video-获得某书笔记详情 smallredbook.item_get_video 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,i…

蓝桥杯第二天学习笔记

二维码生成: import qrcode from PIL import Image, ImageDraw, ImageFont import osdef generate_custom_qr_code(data, qr_file_path, logo_file_pathNone, textNone):# 创建QRCode对象qr qrcode.QRCode(version1,error_correctionqrcode.constants.ERROR_CORRE…

Springboot和Es整合

说明&#xff1a;本文章主要是简单整合和简单增删改查。 1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

stack_queue的底层,模拟实现,deque和priority_queue详解

文章目录 适配器Stack的模拟实现Queue的模拟实现vector和list的对比dequedeque的框架deque的底层 priority_queuepriority_queue的使用priority_queue的底层仿函数的使用仿函数的作用priority_queue模拟实现 适配器 适配器是一种模式&#xff0c;这种模式将类的接口转化为用户希…

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解

1. 背景与目标 ENSO&#xff08;El Nio-Southern Oscillation&#xff09;是全球气候系统中最显著的年际变率现象之一&#xff0c;对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来&#xff0c;深度学习技术在气象领域…

网络安全概述

在早期的互联网&#xff08;也是一种计算机网络&#xff09;中数据都是明文传输的&#xff0c;例如直接使用http协议。但由于越来越多的商业和政府的数据也都在互联网传输&#xff0c;直接使用明文传输&#xff0c;相当于让数据在网络中裸奔&#xff0c;而且网络中攻击者可以直…

39.【4】CTFHUB web sql 布尔注入

进入靶场 按照提示输入1 布尔注入只显示正确与否&#xff0c;手动注入太麻烦,用sqlmap -dbs爆出库名 -tables爆出表名 -columns 爆出字段名 --dump得到flag 笔记 1&#xff0c;sqlmap使用步骤 -dbs 爆出表名 -tables爆出库名 -columns爆出字段名 --dump爆出字段内容 2&a…

C#中通道(Channels)的应用之(生产者-消费者模式)

一.生产者-消费者模式概述 生产者-消费者模式是一种经典的设计模式&#xff0c;它将数据的生成&#xff08;生产者&#xff09;和处理&#xff08;消费者&#xff09;分离到不同的模块或线程中。这种模式的核心在于一个共享的缓冲区&#xff0c;生产者将数据放入缓冲区&#x…

【STM32】HAL库USB实现软件升级DFU的功能操作及配置

【STM32】HAL库USB实现软件升级DFU的功能操作及配置 文章目录 DFUHAL库的DFU配置修改代码添加条件判断和跳转代码段DFU烧录附录&#xff1a;Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时 位带操作位带代码位带宏…

kotlin的dagger hilt依赖注入

依赖注入&#xff08;dependency injection, di&#xff09;是设计模式的一种&#xff0c;它的实际作用是给对象赋予实例变量。 基础认识 class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceSta…

Uniapp判断设备是安卓还是 iOS,并调用不同的方法

在 UniApp 中&#xff0c;可以通过 uni.getSystemInfoSync() 方法来获取设备信息&#xff0c;然后根据系统类型判断当前设备是安卓还是 iOS&#xff0c;并调用不同的方法。 示例代码 export default {onLoad() {this.checkPlatform();},methods: {checkPlatform() {// 获取系…

【MySQL】MVCC详解, 图文并茂简单易懂

欢迎来到啊妮莫的学习小屋 祝读本文的朋友都天天开心呀 目录 MVCC简介快照读与当前读快照读当前读 隔离级别隐藏字段和Undo Log版本链✨MVCC原理--ReadView✨ReadView简介设计思路适用隔离级别重要内容 ReadView规则MVCC整体流程 不同隔离级别下的MVCC读已提交可重复读 总结 M…

VSCode Live Server 插件安装和使用

VSCode Live Server是一个由Ritwick Dey开发的Visual Studio Code扩展插件&#xff0c;它提供了一个带有实时重载功能的本地开发服务器。在VSCode中安装和使用Live Server插件进行实时预览和调试Web应用程序。这将大大提高前端开发效率&#xff0c;使网页设计和开发变得更为流畅…

MC1.12.2 macOS高清修复OptiFine运行崩溃

最近在玩RLCraft&#xff0c;在windows中运行正常的&#xff0c;移植到macOS中发现如果加载OptiFine模组就会崩溃 报错日志 报错日志如下&#xff0c;其中已经包含了各种版本信息&#xff0c;我就不单独说明了。这里说一下&#xff0c;报错的时候用的是oracle jdk x64的&…

医学图像分割半监督学习记录

半监督学习中&#xff0c;一部分数据带标签&#xff0c;一部分不带标签&#xff0c;在模型训练过程中&#xff0c;带标签的数据我们注重分类&#xff0c;无标签的数据我们注重分布。 半监督坚持一致性正则&#xff08;consistency regularization&#xff09;来进行半监督学习&…

12 USART串口通讯

1 串口物理层 两个设备的“DB9接口”之间通过串口信号建立连接&#xff0c;串口信号线中使用“RS232标准”传输数据信号。由于RS232电平标准的信号不能直接被控制器直接识别&#xff0c;所以这些信号会经过“电平转换芯片”转换成控制器能识别的“TTL校准”的电平信号&#xff…

工程水印相机结合图纸,真实现场时间地点,如何使用水印相机,超简单方法只教一次!

在工程管理领域&#xff0c;精准记录现场信息至关重要。水印相机拍照功能&#xff0c;为工程人员提供了强大的现场信息记录工具&#xff0c;助力工程管理和统计工程量&#xff0c;更可以将图片分享到电脑、分享给同事&#xff0c;协同工作。 一、打开图纸 打开手机版CAD快速看图…

abap安装cl_json类

文章来自 SAP根据源码导入/ui2/cl_json类 - pikeduo - 博客园 新建一个se38程序&#xff0c;把源码放到里&#xff0c;源码如下 *----------------------------------------------------------------------* * CLASS zcl_json DEFINITION *----------------------------…

day09_kafka高级

文章目录 kafka高级今日课程内容核心概念整理Kafka的数据位移offset**为什么 Kafka 的 offset 就像是“书签”&#xff1f;****实际意义** Kafka的基准/压力测试测试生产的效率测试消费的效率 Kafka的分片与副本机制kafka如何保证数据不丢失生产者端Broker端消费者端相关参数 K…

vue2制作长方形容器,正方形网格散点图,并且等比缩放拖动

需求&#xff1a;有个长方形的容器&#xff0c;但是需要正方形的网格线&#xff0c;网格线是等比缩放的并且可以无线拖动的&#xff0c;并且添加自适应缩放和动态切换&#xff0c;工具是plotly.js,已完成功能如下 1.正方形网格 2.散点分组 3.自定义悬浮框的数据 4.根据窗口大小…