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

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

时间:2024-11-02 17:46:30浏览次数:1  
标签:__ Core Dump 代码 printf Linux 崩溃 LINE 调试

  我们在嵌入式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

标签:__,Core,Dump,代码,printf,Linux,崩溃,LINE,调试
From: https://www.cnblogs.com/Johness/p/18522264

相关文章

  • Linux笔试题目记录(1)
    文章目录一、Linux文本三剑客---grep、sed、awk二、Linux内核模块相关命令三、Linux内核日志级别四、Linux内存管理之kmallockzallocvmallocmalloc和get_free_page()的区别五、Linux的调度策略六、(多选)下列哪些是linux驱动开发中常用的调试技术()七、简述GDB常见的调......
  • Linux常用命令
    Linux常用命令软件安装的方式1.使用yum安装yum-yinstall包的名称yum-yinstallpackage1package2#查看某个命令是哪个包的1.方式1yumprovidesrz#查看rz是属于哪个包的方式2yumsearchrz特点:(1)自动解决依赖(2)安装的位置是固定的,无法修改(3)......
  • Linux系统System V机制共享内存基础用法C++代码示例
    写数据进程代码//writer.cpp#include<iostream>#include<sys/ipc.h>#include<sys/shm.h>#include<cstring>#include<unistd.h>intmain(){//使用ftok()生成一个唯一的键用来标识共享内存,shmfile需要是一个存在的文件,也可以用其他方法来生成用来标识共......
  • linux---重置密码
    linux---重置密码keywords:重置root密码在忘记密码的情况下,如何重置用户密码?在启动时可以看到GRUB菜单,按"e"修改启动选项(如果启动速度太快,可以录像看看有没有这个界面)找到"linux"开头的行,只修改该行,把"ro"以及之后的内容都删掉,换成"rwinit=/bin/bash"Ctrl+x,启动,进入ro......
  • 【Linux中的第一个小程序】进度条及printf打印彩色字符
    ......
  • 【Linux】文件操作函数 (详解)
     ......
  • kkfileview4.2.1 LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz
    ==问题==java.lang.IllegalStateException:officeHomedoesn'texistorisnotadirectory:optlibreoffice7.1==安装==kkfileview4.2.1 LibreOffice_7.1.4_Linux_x86-64_rpm.tar.gz==测试====全过程脚本==[zengwenfeng@localhostDesktop......
  • .NET 8 中 Entity Framework Core 的使用
    本文代码:https://download.csdn.net/download/hefeng_aspnet/89935738 概述        EntityFrameworkCore(EFCore)已成为.NET开发中数据访问的基石工具,为开发人员提供了强大而多功能的解决方案。随着.NET8和C#10中引入的改进,开发人员现在可以使用更丰......
  • Microsoft Entity Framework Core 8 示例
            微软于2023年11月发布了最新版本的EntityFrameworkCore,该版本与EntityFrameworkCore7相比有很大变化。        要查看新增内容,请查看Microsoft文档EFCore8中的新增功能以及EFCore8文档中的重大变更。        每次发布E......
  • linux开发必备知识(一)CH340相关以及驱动
    CH340是什么CH340是一种USB转串口的芯片,主要用于将USB接口转换为串口(UART),方便与各种串口设备进行通信。它广泛应用于Arduino、单片机开发板及其他需要串口通信的设备中。​​了解上面的知识后我们就知道了CH340是一款常用的USB转串口转换芯片,通常用于将USB接口连......