如何使用Ida Pro和Core Dump文件定位崩溃位置(Linux下无调试符号的进程专享)
我们在嵌入式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
如何使用Ida Pro和Core Dump文件定位崩溃位置(Linux下无调试符号的进程专享)的更多相关文章
- 如何通过dump文件定位崩溃,解决问题
1.dump文件是附加堆栈信息的存储文件的简称,文件扩展名".dmp",通过dump文件我们可以得到程序运行某一时刻的堆栈数据.2.当程序意外崩溃后,通常程序会立即中断运行,拿到这 ...
- 使用GDB 追踪依赖poco的so程序,core dump文件分析.
前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...
- Linux上Core Dump文件的形成和分析
原文: http://baidutech.blog.51cto.com/4114344/904419 Core,又称之为Core Dump文件,是Unix/Linux操作系统的一种机制,对于线上服务而 ...
- Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)
记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += - ...
- gdb调试常用实用命令和core dump文件的生成
1.生成core dump文件的方法: $ ulimit -c //查看是否为0 如果为0 $ ulimit -c unlimited 这样在程序崩溃以后会在当前目录生成一个core.xxx ...
- linux下生成core dump文件方法及设置
linux下生成core dump文件方法及设置 from:http://www.cppblog.com/kongque/archive/2011/03/07/141262.html core ...
- linux 下如何打开core dump文件开关
dump文件可以在程序crash时,方便我们查看程序crash的地方和上下文信息.在window下,要能生成dump文件,需要自己编写相应的代码.不过现在网上可以找到相应的代码,只要把它下载后然后加到 ...
- Linux使用笔记: 定制core dump文件的文件名
在开发过程中,当一个Linux程序异常退出时,我们可以通过core文件来分析它异常的详细原因.缺省情况下,Linux在程序异常时不产生core文件,要想让程序异常退出时产生core dump文件,需要 ...
- core dump文件的生成
#include <stdio.h> int main(int argc, char *argv[]) { char * p = "abcdefg"; p[] = '; ...
- 无法生成core dump文件的几个原因
1. 进程无写权限(如目录不可写.存在同名的非regular文件(目录或符号链接)等) 2. 存在同名文件且有多个hard link 3. 文件系统空间不足 4. 指定目录不存在 5. 进程的RLIM ...
随机推荐
- 神经网络之卷积篇:详解更多边缘检测内容(More edge detection)
详解更多边缘检测内容 已经见识到用卷积运算实现垂直边缘检测,在本博客中,将看到如何区分正边和负边,这实际就是由亮到暗与由暗到亮的区别,也就是边缘的过渡.还能了解到其他类型的边缘检测以及如何去实现这些算 ...
- 七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
教程简介 EasySQLite是一个七天.NET 8操作SQLite入门到实战详细教程(包含选型.开发.发布.部署)! 什么是SQLite? SQLite 是一个软件库,实现了自给自足的.无服务器的. ...
- FlashAttention简介
前置知识 在GPU进行矩阵运算的时候,内部的运算单元具有和CPU类似的存储金字塔. 如果采用经典的Attention的计算方式,需要保存中间变量S和注意力矩阵O,这样子会产生很大的现存占用,并且这些数 ...
- 不是 PHP 不行了,而是 MySQL 数据库扛不住啊
大家好,我是码农先森. 大多数的业务场景下 PHP 还没有达到性能瓶颈,然而 MySQL 数据库就先行驾崩了.但我们总是不分青红皂白,一股脑的把原因归结于是 PHP 语言不行了,每当遇到这种情形我就会 ...
- Java中处理SocketException: Connection reset”异常的方法
Java中处理SocketException: Connection reset"异常的方法 在Java编程中,有时候我们会遇到java.net.SocketException: Conne ...
- 联想小新Air14使用傲梅分区助手进行硬盘克隆出现的问题,克隆完显示RAW格式解决方案,win10家庭版硬盘BitLocker上锁解锁方法
联想小新Air14使用傲梅分区助手进行硬盘克隆出现的问题,克隆完显示RAW格式解决方案 买电脑时没考虑到512会不够用,也没注意到小新Air14是单插槽的,所以有了今天的故事. 本文会就自己的经历,提 ...
- Catlan--卡特兰数--组合数学
卡特兰数 \(Catlan\) ·赘述 其实发现卡特兰数和之前不同的是,前面的是给你公式,让你去求具体的例子,然而卡特兰数这里是给你大量例子来给你证明和解释什么是卡特兰数. ·定义 对于卡特兰数来说, ...
- 基于python的文字转图片工具
地址 https://hub.docker.com/r/rainsccc/strtoimg 拉取镜像后,可以启动一个容器来运行该应用程序.以下命令会启动容器并将其端口映射到主机上: docker ru ...
- 查看 Homebrew 管理的服务的日志
TL;DR 首先找到 log 文件的位置: 对于 macOS (arm64),log 文件在 /opt/homebrew/var/log 目录下 对于 macOS (x86_64),log 文件在 / ...
- 704 二分查找 golang实现
二分查找(Binary Search)是一种高效的查找算法,适用于 有序数组 或 有序列表.它的基本思想是通过将搜索范围逐渐缩小到目标元素所在的一半,从而大大减少查找的次数. 二分查找的基本原理 排序 ...