如何使用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

相关推荐
qetfw13 分钟前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
逆风的蚂蚁2 小时前
linux服务器性能调整怎么落地?我把 CPU 调度、I/O 优先级和内核参数这几个旋钮都拧了一遍
linux·运维·服务器
Zwawa4 小时前
串口为什么会丢字节:从轮询到中断和环形缓冲区
c语言·单片机·嵌入式
zhangxp1234 小时前
【Quectel Pi M2 实战】Day3 USB 摄像头图像采集:拍照、录像与踩坑记录(V4L2 + FFmpeg)
嵌入式
沫璃染墨6 小时前
从零入门计算机网络系列(十一):HTTP协议进阶——从重定向原理到GET/POST与Fiddler抓包
linux·服务器·开发语言·网络·c++·tcp/ip·html
AI_Lab017 小时前
宝塔用了两年,有没有必要换成轻量方案?
linux·运维·服务器
by209997 小时前
Linux GDB 调试与 CGDB 使用
linux·运维·服务器·经验分享
星恒随风8 小时前
Linux网络编程:应用层协议究竟是什么?从网络计算器到TCP Socket抽象基类完整实现
linux·网络·笔记·tcp/ip
feng_you_ying_li10 小时前
linux之网络层
linux·运维·网络
用户83514140494911 小时前
本地跑小模型做语音唤醒:手上那块子能带动吗
llm·嵌入式