addr2line方法使用总结
addr2line:将地址信息转化成函数名或行数(常用于找报错函数的调用者)。使用方法
拿这次报错信息为例。(函数报错,但是没有做异常判断!!!这里规范问题实在要吐槽一下)

0、我们已经知道函数的报错信息,但是更想知道是哪个函数调用了它。
1、首先需要得到报错函数的地址,定义一个局部变量caller,然后获取该变量的地址信息
然后报错时将地址信息打印出来。
2、得到报错的地址,需要在nfs路径下使用命令 arm-hisiv500-linux-addr2line 0x12345678 -e hikdsp -f.
其中arm-hisiv500-linux- 为H3平台的编译链,addr2line为该命令,0x12345678为报错的地址信息 -e 后跟编译的成果物,-f 为显示函数名,具体可参看man addr2line
3、为本次实现的定位的代码

#define __read_lr(caller) __asm__ __volatile__ ("mov %0, lr\n": "=&r" (caller)) /*返回操作数caller的地址*/

这里涉及到内联汇编的语法,内联汇编的用法有一个通用模板:
asm [ volatile ] (
assembler template
[ : output operands ] /* optional /
[ : input operands ] /
optional /
[ : list of clobbered registers ] /
optional */
);
asm为gcc关键字,表示接下来要嵌入汇编代码。为避免keyword asm与程序中其它部分产生命名冲突,gcc还支持__asm__关键字,与asm的作用等价。volatile为可选关键字,表示不需要gcc对下面的汇编代码做任何优化。同样出于避免命名冲突的原因,__volatile__也是gcc支持的与volatile等效的关键字。
由于我们是在C语言中内联汇编代码,故需用双引号""将命令括起来,以便gcc以字符串形式将这些命令传给汇编器。
在内联汇编中,操作数通常用数字来引用,具体的编号规则为:若命令共涉及n个操作数,则第1个输出操作数(the first output operand)被编号为0,第2个output operand编号为1,依次类推,最后1个输入操作数(the last input operand)则被编号为n-1
“=&”指的是输出地址;“r"是寄存器操作数约束(register operand constraint, r)。有了"r"的约束,表明操作数将被存储在指定的寄存器中,如本次该行代码表明将caller值存入lr(R14)寄存器,然后输出操作数caller的地址。
报错时打印出错误信息,然后使用:addr2line方法,打印信息如下

可以看出是哪个函数报错。

addr2line 方法2定位崩溃问题
这里写一个简单的崩溃程序,崩溃后dmsg查看报错地址信息

在这里插入代码片
#include<stdio.h>
/*addr2line 方法使用用例*/
void fun2(int *p)
{int err =0;err = *p;printf("err =%d\n",*p);  return ;
}
int fun1()
{int *p =NULL;fun2(p)  ;return 0;
}
int main()
{unsigned int u32num1 = 1,u32num2 = 2;unsigned int u32Result = 0;u32Result = u32num1 - u32num2;printf("result = %d\n",u32Result); //-1fun1();return 0;
}

dmesg结果如下

使用addr2line

注意编译时加上-g,否则大概率出现?? -g表示不对编译结果进行优化,保留调试信息

  • [ ]

addr2line方法使用总结相关推荐

  1. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  2. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  3. Keil环境下STM32定位hardfault位置方法(addr2line工具)和遇到的情况

    目录 一.概述 二.方法一:Call Stack + Locals 三.方法二:Show Code at Address 3.1 需要通过LR判断SP? 3.1.1 关于MSP和PSP 3.1.2 为 ...

  4. KEIL5 编译器AC6 使用RT-THREAD操作系统 使用组件CmBacktrace方法+addr2line使用

    最新解决方案: 复制里面代码到对应源文件并编译既可 https://github.com/armink/CmBacktrace/pull/62 https://github.com/armink/Cm ...

  5. C++ 调试技术:addr2line

    最常用的调试C++程序的方法是使用IDE,比如说vs,clion.打断点,debug模式跑. 稍微先进一点的是使用gdb进行调试. gdb调试使用到的技术就比较多了,以后详细介绍. 今天看到一个神奇的 ...

  6. 查看某段代码或语句的被调用路径的方法小结

    在看代码时,难免想要知道它是最开始在哪里被调用至此的,或者本段代码是否会被调用.但是由于程序比较复现,各种宏定义,导致很难通直接阅读的方式确认它的被调用路径.平时个人比较喜欢用以下几种方法来确认其调用 ...

  7. Android Framework常用工具及LOG调试方法

    概述 Framework开发是一项非常繁琐复杂的工作,需要阅读大量的源代码,分析及其多的LOG信息来定位错误位置.这个时候如果使用一些工具或者知道如何定位重要LOG信息,就可以使一些复杂的工作变的简单 ...

  8. MCU HardFault问题查找和破解方法

    一.HardFault产生原因和常规分析方法 二.HardFault解决方法分析 三.HardFault回溯的原理 四.操作分析流程: 1.  心里明白徒手分析法 2. CmBacktrace 天龙大 ...

  9. Android 系统(172)---如何使用addr2line命令解析native backtrace

    如何使用addr2line命令解析native backtrace 有时遇到ANR问题,查看SWT_JBT_TRACES文件,发现有些是native backtrace,且GAT-LogView目前无 ...

  10. Android 系统(126)---Android的死机、重启问题分析方法

    Android的死机.重启问题分析方法 阅读数:11986 Android的死机.重启问题分析方法 1.     死机现象 1.1      死机定义 当手机长时间无法再被用户控制操作时,我们称为死机 ...

最新文章

  1. 找对象的过程中,我竟然理解了什么是机器学习!
  2. 构建生产机器学习系统的一些考虑
  3. python抓取网页图片的小案例
  4. 逻辑性不好可以学python吗_如果本文若未能让你学会“Python”,可能真的不适合学习Python...
  5. Redis 实用技术——消息发布和订阅
  6. Cgroup学习之——Ubuntu下交叉编译ARM平台libcgroup工具
  7. Juniper JunOS PPPOE配置
  8. python dateutil安装_Python时间处理-dateutil模块
  9. 【基于机器学习/深度学习的睡眠信号分类】主题必读论文推荐
  10. 【PRD】倒推“Soul”APP产品需求文档
  11. android 电视 vob格式转换,Android手机、Android智能电视、Android平板电脑视频和音频转换器---佳佳安卓视频格式转换器...
  12. 微型技术博客之匿名内部类
  13. onTouchEvent事件不敏感
  14. 多网聚合路由器全新面世,带来联网新体验
  15. 渗透基础学习-信息搜集
  16. 知乎 高级操作系统_一款假的国产操作系统被吹上知乎热榜:浮夸只会害了科技创新...
  17. SAP CO模块的英文缩写
  18. 我用python分析买房数据
  19. linux进程kill命令关不掉
  20. 沟通技巧——共情能力

热门文章

  1. H264编码器与H265编码器对比
  2. Access2016学习9
  3. ssis sql oracle,[SQL][SSIS]透過 SSIS 連接 Oracle 的資料庫
  4. 用excel制作,出入库信息管理表,动态库存表
  5. PX4固件飞行日志的采集设置以及数据读取
  6. 矩阵的Cholesky分解的Matlab简洁实现
  7. inssider序列号_AP注册问题-华三.ppt
  8. 斐讯k2路由器刷第三方固件
  9. android mac地址过滤,android手机怎么更改mac地址绕过mac过滤
  10. 基于matlab的车牌识别系统的实现