如何使用Ida Pro和Core Dump文件定位崩溃位置(Linux下无调试符号的进程专享)

news/2025/1/10 23:31:31/文章来源:https://www.cnblogs.com/Johness/p/18522264

  我们在嵌入式Linux开发过程中经常会遇到一个问题,就是程序崩溃后不知道具体位置。因为我们发布到生产环境的一般是没有调试符号的(使用strip或编译时加-s参数,CMake生成的编译指令中的-O3也会造成调试符号丢失),毕竟嵌入式的存储都比较有限,肯定是需要剥离调试符号的。

  另外一个经常遇到的问题是Release版本会崩溃,Debug不崩溃,因为-g参数有时候会让编译器对一些变量进行默认赋值,这又给我们调试增加难度:上Debug吧空间不允许,运行速度也不够(没有-O了);上Release,又崩溃……

 

  接下来我为大家提供一个思路,可以在无调试符号的情况下定位崩溃位置。

  首先我们准备一个简单的测试代码,让他崩溃一下。

#include <stdio.h>
#include <stdlib.h>int func1() {
printf("%d\n",__LINE__);int *p = NULL;*p = 0;
printf("%d\n",__LINE__);
return *p;
}void func2() {
printf("%d\n",__LINE__);
func1();
printf("%d\n",__LINE__);
}void func3() {
printf("%d\n",__LINE__);
func2();
printf("%d\n",__LINE__);
}int main() {
func3();return 0;
}
//gcc -s -O3 main.c

  我们编译执行后,毋庸置疑,它会崩溃。

   此时如果我们用gdb调试,当然是无法定位问题,因为没有调试符号,它无法backtrace,直接给你两个问号。

 

  接下来重头戏来了,我们使用Ida Pro来试试定位!

  首先我们使用gdb的一些命令获取崩溃的模块(是主程序还是某个so),以及崩溃的代码位置。

   我们使用info proc map指令获取崩溃的代码所在模块,确定是我们主程序a.out代码崩溃的(这个很重要,咱作为程序员,一定要用事实说话,不可以猜)

  然后我们通过x/16x $pc来获取崩溃的汇编代码(这个指令就是获取是哪句汇编代码导致程序崩溃的)。

  (当然,一般崩溃就是几个字节的一句汇编导致的,用不了16个字节,不过我们要做特征匹配)

 

  紧接着,我们打开16进制查看工具,搜索这组16进制的位置

   可以看到,汇编代码在整个进程的偏移量是0x1242

  我们打开Ida Pro,装载a.out

   在Hex View界面找到0x1242,鼠标点击,会得到一个函数名和偏移量。

  我们在左侧的Functions窗格双击对应函数名可以进入

   (有时候这个函数比较复杂,我们在这种图形下不好定位,可以右键切换到Text View进行查看)

  

   当然,走到这里之后我能给大家的参考就少了。接下来就要靠大家自己联系上下文汇编找到报错的代码对应的源码了。

 

  也可以按F5进入伪代码窗口(伪代码是Ida Pro提供的汇编转c语言的功能,不一定完全对,但很大程度上提供了帮助)

 

  最后更新时间 2024-11-02 17:49:50

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

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

相关文章

统计学习方法笔记

统计学习方法 1.3 统计学习方法的三要素 1.3.1 模型 好,为什么要从1.3开始呢,因为看前面的课,我还没有用到这个软件。 方法=模型+策略+算法 模型有好多个,试试 策略:按照什么样的准则去选取模型 比如说看预测值和真实值有多大,或者损失函数最小等 算法 即怎样去实现去寻找…

zookeeper的安装与搭建

1、下载zookeeper,并上传到Linux并解压tar -xvf zookeeper-3.5.7.tar.gz -C ../2、修改文件名配置环境变量mv apache-zookeeper-3.5.7-bin zookeeper-3.5.7 vim /etc/profile source /etc/profile3、修改配置文件创建data目录mkdir data创建myid文件touch myid vim myidserver…

Windows Server2022服务器部署RuoYi若依前后端分离

部署准备 虚拟机Windows Server2022 若依前后端分离v3.8.8打包好 jdk1.8 redis5 mysql8.4 iis服务 路由插件 重写插件 1.安装jdk1.8 https://www.azul.com/downloads/#downloads-table-zulu 略 2.安装启动redis5 https://github.com/tporadowski/redis/releases 下载安装默认配…

20222407 2024-2025-1 《网络与系统攻防技术》实验四实验报告

(一)实践目标 恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: o使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; o使用超级巡…

状态压缩动态规划

\(3^n\)枚举子集 状压DP中相当重要的技巧(虽然后位有FWT,FMT替代,但不是都能代) for(int i = x; i; i = (i - 1) & x) { // i 就是 x 的子集 }题目 P6622 [省选联考 2020 A/B 卷] 信号传递 看数据范围,\(m \le 23\),且不同分数段增长很慢,表明会有\(O(2^m)\)的做法,…

专题

求区间第k小值 静态 分块 排序 划分树 动态 主席树 平衡树 子树求交 树上颜色问题 统计颜色数量 对于子树\(x\),子树内同种颜色的点只有深度最浅的对子树外有贡献 #3628. 「2021 集训队互测」树上的孤独 贡献上传:对于\(x\),设它同颜色祖先为\(p\),则\(x\)对路径\(p\thicks…

BEVDet4D: Exploit Temporal Cues in Multi-camera 3D Object Detection阅读小结

BEVDet4D提出:提出BEVDet4D范式,将BEVDet从仅空间的3D扩展到时空4D工作空间。BEVDet4D: Exploit Temporal Cues in Multi-camera 3D Object Detection BEVDet4D:在多相机三维目标检测中利用时间线索 摘要背景:单帧数据包含有限信息,限制了基于视觉的多相机3D目标检测性能。…

H7-TOOL的LUA小程序教程第17期:扩展驱动AD7606, ADS1256,MCP3421, 8路继电器和5路DS18B20(2024-11-01)

LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用,支持在线调试运行,支持离线运行。TOOL的LUA教程争取做到大家可以无痛调…

Print和Println区别

看这样一段程序: // 我的减重程序,lbs是磅的简称package mainimport ("fmt" )func main() {fmt.Println("My weight on the surface of Mars is ")fmt.Println(112 * 0.3783)fmt.Println(" lbs, and I would be ")fmt.Println(19 * 365 / 687)…

【semantic Kernel】Semantic Kernel Tools(VS Code插件)

2023年4月13日,Microsoft发布了一个 Semantic Kernel 的 VS Code 插件,Semantic Kernel Tools,用于进行Semantic Function的开发和调试工作。 Semantic Kernel Tools的安装只需要VS Code即可,不需要额外的其他的环境。 在 VS Code的扩展中搜索 Semantic Kernel Tools ,点击…

java.file文件与IO流.study

但断电后后数据消失。 而IO流就是对数据进行读写 File创建对象: 绝对路径与相对路径: File提供的判断文件类型,获取文件信息功能: File创建和删除文件相关方法: File 遍历文件夹的方法: 代码实现: 文件搜索,实现遍历文件夹下的多级目录:遍历删除文件夹及其里边的…