可执行文件的符号表(symbol table)记录了某个可执行文件中的函数名、全局变量、宏定义等符号信息,这些信息对于我们调试十分重要。

在带符号表的可执行程序中包含有调试信息,其中很重要的一份数据就是程序源程序的行号和编译后的机器代码之间的对应关系Line Number Table。DWARF格式的Line Number Table是一种高度压缩的数据,存储的是表格前后两行的差值,在解析调试信息时,需要按照规则在内存里重建Line Number Table才能使用。

行号信息,必须-g编译才有。

addr2line根据符号表-地址,获取函数行


#include <stdio.h>int func(int a, int b)
{return a / b;
}int main()
{int x = 10;int y = 0;printf("%d / %d = %d\n", x, y, func(x, y));return 0;
}

Line Number Table存储在可执行程序的.debug_line域,使用命令

$readelf -w a.out
## 输出DWARF的调试信息
Line Number Statements:[0x000000bf]  Extended opcode 2: set Address to 0x64a[0x000000ca]  Special opcode 9: advance Address by 0 to 0x64a and Line by 4 to 5[0x000000cb]  Special opcode 146: advance Address by 10 to 0x654 and Line by 1 to 6[0x000000cc]  Special opcode 104: advance Address by 7 to 0x65b and Line by 1 to 7[0x000000cd]  Special opcode 36: advance Address by 2 to 0x65d and Line by 3 to 10[0x000000ce]  Special opcode 118: advance Address by 8 to 0x665 and Line by 1 to 11[0x000000cf]  Special opcode 104: advance Address by 7 to 0x66c and Line by 1 to 12[0x000000d0]  Special opcode 104: advance Address by 7 to 0x673 and Line by 1 to 13[0x000000d1]  Advance PC by 42 to 0x69d[0x000000d3]  Special opcode 6: advance Address by 0 to 0x69d and Line by 1 to 14[0x000000d4]  Special opcode 76: advance Address by 5 to 0x6a2 and Line by 1 to 15[0x000000d5]  Advance PC by 2 to 0x6a4[0x000000d7]  Extended opcode 1: End of Sequence
## 运行a.out
$./a.out## 显示内核缓冲(有coredump信息和开机启动信息)
# 清空
$dmesg -C
# 记录
$dmesg

ip字段后面的数字就是程序出错时所程序执行的位置

[ 1246.281072] traps: a.out[3368] trap divide error ip:556663950658 sp:7fff4e09a9c0 error:0 in a.out[556663950000+1000]

addr2line-使用带符号的可执行文件地址/库offset反解行号

Given an address in an executable or an offset in a section of a relocatable object, it uses the debugging information to figure out which file name and line number are associated with it.

$addr2line -e a.out 658
/home/ubuntu/daily/test.cpp:6

参数

-C,去除自动添加的前后缀

-i,显示inline函数

-p,输出符合人类审美

-e,指定文件,default=a.out

常见问题

addr2line

??:0 # 地址错误,本身有符号表(或者被strip过,符号表被剥离)

  • 尝试替换为绝对/相对地址

??:? # 本身没有符号表(!-g)

  • 没有使用-g编译

相关功能

$nm

-C,去除自动添加的前后缀

-n,可以按偏移排序

-l,显示行号

  • 可以查看出问题点的函数,没有行信息

  • 如果down在库中,用于确定down在了哪个库函数中

# 去掉可执行文件的调试信息,使其体积变小(比-O3还小)
$strip

关联

nm ==? function name map,即map文件:

-Wl,-Map=test.map

应用

一份带符号的bin/so文件,一份不带符号的bin/so文件的崩溃堆栈或asan堆栈。

可以放在一起解析出一个带函数行的backtrace。

原理

同一份代码,同一个编译器,带g编译和不带g编译,代码段内存分布相同。

程序运行,调试多次,加载地址(main的开始地址)可能不同,但是函数的偏移量始终都是一样的。

参考

addr2line

https://blog.csdn.net/u013827488/article/details/107048407/

nm

https://blog.csdn.net/qq_34026204/article/details/125415233

符号表工具addr2line相关推荐

  1. android bugly 符号表,Bugly的符号表工具使用总结-iOS

    首先先说下bugly的崩溃统计是实时的,即你的app前脚崩溃,bugly后脚就会给你统计到,但是在统计崩溃信息的时候有的时候可能只给你记录了一个简单的崩溃信息,并不能详细的告诉你哪个类的哪个方法的哪行 ...

  2. android用符号表定位问题

    有时候我们出现的软重启问题,只有段错误,只给你一个错误地址,没有具体信息,像这种问题我们应该怎么分析呢: 我们先举个例子: ...F DEBUG : pid: 11028, tid: 11046, n ...

  3. iOS中 Bugly iOS 符号表手动配置详细教程 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博!iOS开发者交流QQ群: 446310206 官方教程 官方的符号表工具iOS文档版­使用指南不是很详细,于是自己动 ...

  4. bugly android z自动上传符号表失败,Bugly 符号表上传错误分析+解决办法

    最近发现了Bugly的符号表没有上传,追踪了下发现在Debug和Release模式都可以上传符号表,但一打包(Archive)就不会上传符号表 command+9查看下日志 查看日志 发现接口返回报错 ...

  5. bugly上传符号表文件详细教程

    1.下载上传符号表工具 https://bugly.qq.com/v2/downloads 2.在终端 进入到 buglyqq-upload-symbol.jar 文件夹中 3 执行命令 java - ...

  6. iOS之Bugly上传符号表

    前提条件:Mac中需要先安装java环境,只支持jdk1.8.0,终端输入:java -version 看看版本号是多少 1.在bugly官网下载符号表上传工具 2.桌面新建一个文件夹名字可以随便起, ...

  7. Unity 之 安卓堆栈跟踪和日志工具 (Android Logcat | 符号表解析Bugly捕获)

    Unity 之 日志解析工具 Android Logcat 一,工具集成 1.1 注意事项 1.2 导入插件 二,连接设备 2.1 使用USB连接 2.2 无线连接 三,实用功能介绍 3.1 通用介绍 ...

  8. 使用objdump objcopy查看与修改符号表

    使用objdump objcopy查看与修改符号表 动态库Linuxgccfunction     我们在 Linux 下运行一个程序,有时会无法启动,报缺少某某库.这时需要查看可执行程序或者动态库中 ...

  9. linux下动态库符号表,Linux动态库(.so)符号表

    最近编译libbinder.so发现system/lib/libbinder.so只有358K,但单独编译生成的obj/SHARED_LIBRARIES/libbinder_intermediates ...

最新文章

  1. 河北计算机课本初中,河北:2019-2020学年中小学教学用书有变
  2. java中的字符,字符串,数字之间的转换(亲测)
  3. 使用 OpenLDAP 集中管理用户帐号
  4. dataframe 如何选中某列的一行_带你领略pandas中多表之间如何处理
  5. python做插件应用_Python插件机制实现详解
  6. Linux基础:find命令总结
  7. androidq获取文件正式路径_android Q 新特性
  8. 51单片机几种精确延时(包含自动适应主时钟)
  9. 傅里叶光学随机散斑原理 matlab仿真实现随机散斑
  10. 复习单片机:流水灯(内含2种方法(左移操作符法+crol法)+设计思路+原始代码)
  11. 铁路订票系统的简单设计(转自云风)
  12. 【翻译】Computer Vision for Autonomous Vehicles:Problems,Datasets and State-of-Art
  13. 【数据分析】——分析方法
  14. 《浮世绘---湖北人,你到底患了什么病》(转载)
  15. DirectX 在MFC框架下的应用
  16. 马毅教授讲座——反思深度学习:回归计算机视觉的挑战
  17. 工业物联网 凌顶发布注塑机通讯协议Euromap 63 的 OPCUA 驱动组件
  18. 『往事』之---我的童年少年时代
  19. 薅羊毛: 微信小程序开发者可以免费使用验证码短信服务了!
  20. 未来几年GPT/大模型如何影响软件研发?

热门文章

  1. 2023.02.14草图大师 卧室房间 效果图
  2. 《实战 Linux Socket 编程》Warren W.Gay 图解Key-point学习笔记-1
  3. 3_1 操作系统定义、分类及功能【包含linux操作系统基础知识】
  4. python 数列筛选_对numpy中的数组条件筛选功能详解
  5. Generative Time Series Forecasting with Diffusion, Denoise, and Disentanglement
  6. 10月14日科技资讯|华为折叠屏手机月底或开卖;苹果计划 3 年内推出 5G 基带芯片;Node.js 12.12.0 发布 | 极客头条
  7. 计算机房的正常温度和湿度,各类机房的温湿度标准参考
  8. CPU设计——CPU核解析——cv32e40p
  9. 昆石VOS2009/VOS3000 2.1.6.00 Web接口说明书
  10. JavaScript之BOM(BOM构成、常用事件)