GDB调试技巧实战--为release程序加载符号

2023-11-14

#问题#

内存数据分析是开发人员的重要技能,特别是对于C/C++程序员而言。微软表示,“微软每年分配的CVE中有70%仍然是内存安全问题”。内存数据就像事故现场,人们可以在其中发现内存数据重叠或损坏的内存数据,从而可能提供有价值的洞察力,揭示问题的根本原因。如果是DEBUG版本的程序,我们可以轻松打印数据结构及对应的值,但是release版本的程序或coredump就很难了,一般我们只能通过GDB里的x命令打印一段内存的内容,然后对照偏移确定某个成员的值,比较费眼睛。

#目标#

本文将提供一个全面的指南,介绍如何使用Gdb加载符号从而自动格式化内存数据。前提是您已经准备好了源代码。如果您正在分析来自客户的核心转储文件(coredump),或者研究仅在发布版本可执行文件上复现的问题,您可以从中受益。


#传统方法#

当从客户那里收到一个核心转储时,通常是从一个发布版本的可执行文件中得到的,这意味着没有调试符号存在。因此,我们需要手动计算目标结构成员的偏移量,如果它不是顶层结构,则可能需要多次重复这个过程。这里有一个例子:

$ cat structAA.h  
struct AA{
        int AA1;
        int AA2;
        struct BB* AA_BB;
        char AA_c;
};

$ cat structBB.h
struct BB{
        int BB1;
        int BB2;
        int BB3;
};

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

GDB调试技巧实战--为release程序加载符号 的相关文章

  • fork 后调试子进程(配置了 follow-fork-mode 子进程)

    我正在开发一个应用程序 父级分叉子级来处理某些任务 我遇到一个问题 我已将 gdb 配置为 follow fork mode 子级 但在 fork 后 到达断点后 它发送 SIGTRAP 但子级以某种方式终止并向父级发送 SIGCHLD 我
  • gdb nostop SIGSEGV 在特定线程上

    我有一个程序故意在一个线程上出现段错误 但我有一个问题 另一个线程出现段错误 我想用 GDB 捕获它 我看到我可以 handle SIGSEGV nostop noprint 但我只想在故意这样做的线程上这样做 有可能吗 我会解释一下 我有
  • 分离Gdb而不恢复劣质

    Gdb 与任何其他程序一样 并不完美 我时不时会遇到导致当前 Gdb 实例无法使用的错误 此时 如果我有一个调试会话 其中有很多有价值的状态 我希望能够在其上启动一个新的 Gdb 会话 也就是说 分离 退出 Gdb 并启动一个新的 Gdb
  • GDB 函数参数上的条件中断

    我想在函数参数大于某个值时设置断点 下面的虚拟代码 int main void uint64 t num 123456 uint64 t x 847534 uint64 t other num x x num other stuff her
  • 有什么方法可以判断我的 iPhone 应用程序在运行时是否在调试器下运行?

    如果我的错误处理代码在调试器下运行 我希望它的行为有所不同 具体来说 如果我在手机上运行 未连接到调试器并且断言失败 我想将错误发送到我的服务器 当我在gdb下时 我想闯入调试器 虽然我可以想象苹果将如何编写代码 但我找不到任何关于测试调试
  • 专门逐行调试

    我有一个用 Pascal 编写的脚本 我会以这种方式调试它 在每一行停止 转储内存中所有变量的值 然后转到下一行 是否可以使用 gdb 或其他 Linux 开源工具来完成此操作 使用选项编译文件 g fpc gpc g file pas R
  • 使用 gdb 调试反汇编库

    在Linux和Mac OS X中可以使用strapi和next来调试应用程序而无需调试信息 在 Mac OS X 上 gdb 显示在库内部调用的函数 尽管有时会在每个 stepi 指令中推进多个汇编程序指令 在 Linux 上 当我进入动态
  • 使用 libtool 和 gdb

    我正在开发一个使用 GNU 自动工具的项目 因此为了使用 gdb 调试代码 我从 libtool 中运行 gdb libtool mode execute gdbtui foobar 是否可以重新加载项目的修改版本 而不必退出 gdb li
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • “劣质调试器”一词中的“劣质”是什么意思?

    我不太明白GDB手册中对inferior的解释 谷歌也没有提供任何更有帮助的信息 谁能简单地解释一下 低等 劣质 是一个通用术语 表示 您正在使用 gdb 来调试的东西 通常是在模拟器或通过串行线路连接的其他硬件上运行的进程或内核 当您使用
  • Eclipse 调试模式下的 GDB 找不到 stdlib/rand.c

    我试图让 gdb 在 ubuntu 上与 eclipse cdt 一起运行 以开始调试一些简单的程序 所以我做了我认为必要的步骤来让它运行 1 创建可执行项目 2 Compile 3 Run 4 创建文件 gdbinit 并将其放在主项目文
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • GDB - 将地址映射到源代码中的行和列

    gcc 和 clang 都有选项 gcolumn info 描述如下 将位置列信息发出到 DWARF 调试信息中 而不仅仅是文件和行 我已经使用此选项编译了我的二进制文件 现在我有一些指令的地址 想将其翻译回源文件 行号和列 有没有办法在g
  • gdb 脚本:在选定的断点处执行命令

    我想在 gdb 脚本中预定义一些断点 并在这些断点处调用一些特殊命令 然后自动继续程序执行 因此 理想情况下 我想要一个如下所示的 gdb 脚本 b someFunction if breakpoint from above reached
  • 如何将STL容器数据转储到gdb中?

    我无法在 gdb 中转储 STL 无序映射容器值 变量类型是 std unordered map var 我的 gdb 版本 7 7 1 GDB配置 configure host x86 64 linux gnu target x86 64
  • 评估 gdb 中的变量/函数

    我有以下代码 char seg mmap 0 printf seg x n seg 该程序打印seg b7ffd000 而在 gdb 中 对于相同的执行 当使用p x seg 它打印 2 0x0 我在这里很困惑 这不是同一个var吗seg
  • 多线程调试器[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 GDB 在使用多线程 pthreads 进行调试时存在严重问题 nix 上还有其他好的 C C 多线程调
  • 是否可以根据函数要返回的内容在函数末尾设置条件断点?

    我有以下更复杂的版本 unsigned int foo unsigned int bar unsigned int myFunc return foo bar 就我而言 myFunc从很多地方调用 在其中一种情况下 出现了问题 通过进一步调
  • 使用 -ffile-prefix-map 会中断调试

    在 DAYJOB 我正在尝试实现可重复的构建 以使调试已发布的软件变得更容易 我们的构建服务器上不再有完整的调试版本 使用来自可重现的构建 org https reproducible builds org 使用 ffile prefix

随机推荐

  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • Cisco交换机配置VTP

    文章目录 1 拓扑图 2 任务描述 3 Sw1配置 4 Sw2配置 5 Sw3配置 6 测试 1 拓扑图 2 任务描述 在 SW1 SW2 和 SW3 上配置 VTP 版本2 Sw1为服务器 Sw2 Sw3为客户端 使用java csdn做
  • Java接口默认实现、接口和抽象类区别

    Java8新特性 Java8接口可添加默认实现 接口和抽象类的区别 设计模式 缺省适配模式 Java8接口可添加默认实现 java8新增了接口默认实现功能 每个接口可以有默认实现 实现类可以根据其需要进行定制化得实现 抽象方法前面添加def
  • 复旦邱锡鹏:深度剖析 ChatGPT 类大语言模型的关键技术

    内容来源 ChatGPT 及大模型专题研讨会 分享嘉宾 复旦大教授 邱锡鹏 分享主题 对话式大型语言模型 转载自CSDN稿件 ChapGPT 自问世以来 便展现出了令世人惊艳的对话能力 仅用两个月时间 ChatGPT 月活跃用户就达一亿 是
  • 网课教程(1) 前言

    什么是脚本 脚本 Script 是使用一种特定的描述性语言 依据一定的格式编写的可执行文件 脚本语言又被称为扩建的语言 或者动态语言 是一种编程语言 用来控制软件应用程序 脚本通常是以文本 ASC 保存 只是在被调用时进行解释或者编译 我们
  • CRM系统基本的模板示例

    CRM SSM总结 1 步骤 1 1 创建WEB项目 1 2 导入JAR lib下 包以及静态资源 css fonts js jsp 2 数据库 CREATE DATABASE crm ssm 客户来源 电话营销 网络营销 推广活动 促销活
  • 模式识别原理(Pattern Recognition)、概念、系统、特征选择和特征

    1 1 模式识别的基本概念 一 广义定义 1 模式 一个客观事物的描述 一个可用来仿效的完善的例子 2 模式识别 按哲学的定义是一个 外部信息到达感觉器官 并被转换成有意义的感觉经验 的过程 例 识别热水 字迹等 二 狭义的定义 1 模式
  • ML-数据分析模板

    文章目录 机器学习 数据分析模板 Objective Data Set Information Attribute Information INPUT 单特征与缺失值展示 Feature Cleaning Engineering 标签转换
  • Window10与Linux虚拟机实现文件传输

    前言介绍 对于许多需要使用Linux虚拟机的小伙伴来说 如何实现虚拟机和主机间的文件传输是一个问题 尤其是有些文件虚拟机下载不太方便 这时文件共享就比较重要了 当然 虚拟平台的软件提供商也有着一些解决方案 如VM下的Tools工具或者VB下
  • 5种Python雪花飘落代码(建议收藏)

    前言 本文章向大家介绍用 Python 实现雪花飘落效果 运行以下代码 你将会看到一个美丽的雪花效果 你可以根据自己的需求 调整代码中的参数值以及其他细节 第一种 普通雪花代码 import turtle import random def
  • sqrt函数

    sqrt 函数的用法 求三角形面积 今天刷题的时候看到了三角形面积 突然想到老师上课讲过 这不是好简单 就直接上代码 include
  • Faster R-CNN算法

    Faster R CNN算法是作者Ross Girshick对Fast R CNN算法的一种改进 Fast R CNN在速度和精度上都有了不错的结果 但仍有一些不足之处 Faster R CNN算法同样使用VGG 16网络结构 检测速度在G
  • 联想笔记本声音太小怎么办_电脑音量调到最大了还是声音太小,怎么办啊??...

    展开全部 准备一台电脑 计算机需e68a843231313335323631343130323136353331333433643633要安装驱动程序向导 或备份声卡驱动程序或驱动程序光盘 以下步骤是win7操作界面截图演示 1 首先 点击
  • java中的访问修饰符详解

    主要讲述一下java中protected的修饰控制范围 在叙述protected修饰符使用之前 先来说一下java 可以发现 开发java程序是一个时时刻刻都在编写类 开发类 定义类的过程 类里面可以有main方法 main方法不管存在那个
  • ppt太大怎么压缩变小呢?五种方法灵活运用

    为了更好地压缩PPT文件 还有一些制作PPT时的建议 使用压缩后的图片 在将图片插入到PPT中时 可以将其压缩后再插入 这样可以显著减小文件大小 废弃多余的幻灯片 将不需要的幻灯片删除或隐藏掉 这样可以减小PPT文件的大小 关闭自动保存 在
  • VC++中窗口过程函数及其消息发送、响应机制介绍

    在VC 中 窗口过程函数是应用程序定义的一个函数 主要功能是处理发送给窗口的消息 窗口过程函数的定义是 virtual LRESULT WindowProc UINT message WPARAM wParam LPARAM lParam
  • maven本地私服取jar包后再进行反编译获取源代码

    1 先去maven安装目录寻找setting xml D maven apache maven 3 1 1 conf 利用记事本打开 寻找标签 nexus central nexus mirror http XXX XXX XX XX 80
  • 【深度学习】CNN模型处理简单时间序列

    本文使用CNN模型 Conv1d卷积进行时间序列的分析处理 将数据导入模型后 可以运行 但模型预测精度不高 且输出十分不稳定 此模型仅用于熟悉CNN模型的基本结构 如有错误 还望海涵 目录 一 数据介绍 二 数据预处理 三 模型代码 四 模
  • 使用fastjson报错Exception in thread “main“ com.alibaba.fastjson.JSONException: syntax error, pos 1, line

    使用fastjson报错Exception in thread main com alibaba fastjson JSONException syntax error pos 1 line 1 column 2 问题背景 解决方案 总结
  • GDB调试技巧实战--为release程序加载符号

    问题 内存数据分析是开发人员的重要技能 特别是对于C C 程序员而言 微软表示 微软每年分配的CVE中有70 仍然是内存安全问题 内存数据就像事故现场 人们可以在其中发现内存数据重叠或损坏的内存数据 从而可能提供有价值的洞察力 揭示问题的根