linux64位系统 addr2line使用
简介
64位系统运行的可执行文件的符号表地址和实际运行时地址差异甚大。
譬如使用nm查看函数的地址为0x69207
,但是运行时打印函数的地址为0x7FA3333F8207
。
那么我们通过backtrace,手动打印,gdb,pstack获取到函数调用栈信息时,如果可执行程序是经过strip过的,打印出来将是一堆0X7F
开头的大地址(0x7FA3333F8207
),使用addr2line直接进行定位,显示是??:00
。
原因是因为0x7FA3333F8207
是动态映射的虚拟地址,该虚拟地址是通过而符号表地址(0x69207
)+该代码段映射区间的地址(0x7fa33338f000
)得来的。
那么我们如果要得到真正的代码位置,需要知道代码段映射地址区间,以及包含符号表信息的原始可执行程序
代码段映射地址区间
代码段映射地址区间是动态生成的,所以如果要获得真是的区间信息,必须再程序运行时通过命令
cat /proc/{pid}/smaps
获取完整的映射信息。如果崩溃前没有完整的信息,那肯定就没法通过addr2line定位程序崩溃位置了。
程序运行以后,我们可以通过一下命令,获取的所有代码段映射地址区间:
cat /proc/{pid}/smaps | grep "[0-9a-z]\+\-[0-9a-z]\+ ..x."
拿flutter运行demo举例子,打印部分内容如下
00400000-00403000 r-xp 00000000 08:01 1061542 /home/suchp/suchp_familly/github/project/myapp/build/linux/x64/debug/bundle/myapp
7fa2b0280000-7fa2b0300000 rwxp 00000000 00:00 0
7fa2b0e00000-7fa2b0e80000 rwxp 00000000 00:00 0
7fa2b1500000-7fa2b1580000 rwxp 00000000 00:00 0
7fa2b1900000-7fa2b1980000 rwxp 00000000 00:00 0
7fa2b1d00000-7fa2b1d80000 rwxp 00000000 00:00 0
7fa2b2380000-7fa2b2400000 rwxp 00000000 00:00 0
7fa2b2800000-7fa2b2880000 rwxp 00000000 00:00 0
7fa2b3000000-7fa2b3080000 rwxp 00000000 00:00 0
7fa2b3600000-7fa2b4000000 rwxp 00000000 00:00 0
7fa2e0080000-7fa2e0100000 rwxp 00000000 00:00 0
7fa2e0680000-7fa2e0700000 rwxp 00000000 00:00 0
7fa2e107a000-7fa2e107f000 r-xp 00000000 08:01 1573497 /usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-png.so
7fa2e2275000-7fa2e2281000 r-xp 00000000 08:01 1447203 /usr/lib/x86_64-linux-gnu/gio/modules/libdconfsettings.so
7fa2e2482000-7fa2e2493000 r-xp 00000000 08:01 1321733 /usr/lib/x86_64-linux-gnu/libwayland-server.so.0.1.0
7fa2e2695000-7fa2e269c000 r-xp 00000000 08:01 1321798 /usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0.0.0
7fa2e289d000-7fa2e28aa000 r-xp 00000000 08:01 1321015 /usr/lib/x86_64-linux-gnu/libgbm.so.1.0.0
7fa2e2aac000-7fa2e2ae8000 r-xp 00000000 08:01 1320572 /usr/lib/x86_64-linux-gnu/libEGL_mesa.so.0.0.0
7fa2e2cec000-7fa2e2cfe000 r-xp 00000000 08:01 1320570 /usr/lib/x86_64-linux-gnu/libEGL.so.1.0.0
我们就可以知道代码地址在哪个区间中,从而知道该地址在哪个动态库中。
然后用虚拟地址0x7FA3333F8207
减去左区间地址0x7fa33338f000
即可得到真正的符号表地址
addr2line
使用addr2line
addr2line -f -e /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5600.4(未strip过的动态库或者可执行文件) 0x69207(符号表偏移地址)
g_shell_parse_argv
??:?
linux64位系统 addr2line使用相关推荐
- linux64位系统兼容32位程序(不下载兼容包)
64位系统兼容32位系统,正常通过apt指令安装兼容包即可.也就是两条命令的事情: apt-get install gcc-multilib apt-get install g++-multilib ...
- 深度linux64位系统下载,深度操作系统下载 deepin深度操作系统 15.10 正式版 64/32位 下载-脚本之家...
deepin深度操作系统官网已经发布了深度操作系统15.10的发布下载. 深度操作系统V15.10修复了已知的各种问题,并对现有的部分功能进行了优化和改进,深度操作系统V15.10基于Debian s ...
- linux64位系统需要安装32位mysql_在Ubuntu16.04 Linux 64位环境下安装二进制版本MySQL 8.0.13...
a.MySQL依赖于libaio库.如果此库不在本地安装,则数据目录初始化和随后的服务器启动步骤将失败.如果需要,请使用适当的包管理器安装它.例如,基于云计算的系统: hell> apt-cac ...
- u盘linux64位系统下载,UNetbootin(最新U盘启动盘制作工具) X64位 V6.6.1 Linux版
UNetbootin是一款U盘启动盘制作工具,它能够帮助用户制作U盘启动盘,它可以通过下载ISO(CD映像)文件或使用已经下载的ISO文件来加载发行版. [如何使用] 1.U盘启动的制作: 使用une ...
- Linux下的32位C程序,linux系统c语言生成.so文件,生成64位可执行文件,在64位系统中运行32位的可执行文件...
1.linux 系统c语言生成.o文件,---->gcc -m64 -c -fPIC test.c -o test.o 2.linux 系统c语言生成.so文件,----->gcc -sh ...
- amd cpu跑linux64,给新手提醒:amd的cpu绝大部分支持64位系统。
jagub 于 2009-06-10 09:10:06发表: 引用: 但是换系统很麻烦的,,,,所以我正在犹豫,先用我的arch吧,用着挺顺手的,等着我再自己搭建环境吧,反正就是装软件包的事. 微宝贝 ...
- 记实现TDengine时序数据库支持 .Net Windows 32位系统踩坑
TDengine是一个高效的存储.查询.分析时序大数据的平台,专为物联网.车联网.工业互联网.运维监测等优化而设计的数据库, 官方目前没有提供完整的.Net Core 解决方案, 因此闲来无事, 从基 ...
- vc++64位系统下long的长度为4个字节_64位系统究竟牛逼在哪里?
想必大家都遇到过这样的问题:安装某个软件的时候,出现提示选择32位版本还是64位版本?我们也可以查看自己的电脑是32位还是64位系统. Windows Linux 大家可能知道32位和64位和系统有关 ...
- 32位java 最大内存_【答疑系列】为什么32位系统只支持最大4G内存?
这个问题一直都有同学问到,算是提问次数最多的问题之一了. 32位是什么 现在主流的操作系统都是64位的,早期存在32位操作系统,相信大家也都有所听闻,其实,在更早之前,还有16位.8位的,这里就不展开 ...
- 计算机32位操作系统最大识别到内存,win7 32位系统可以支持多大的内存_win7 的32位系统最大支持多少g的内存...
大家都知道win7系统有32位和64位之分,而两者的安装配置是不一样的,一般4G内存的我们安装64位的系统,但是很多用户不知道win7 32位系统可以支持多大的内存,这就给大家分享一下win7 的32 ...
最新文章
- 【FFmpeg】AVOutputFormat/AVInputFormat 成员变量 flags 总结
- 单商户商城与多商户商城的区别
- React+TypeScript练手小项目
- Javascript获取当月的天数
- python常见的排序算法_常见排序算法之python实现
- 简单介绍Kubernetes
- System类、包装类、Math类、Random、Arrays工具类
- 1.15-1.16 sqoop action
- srsLTE源码学习:RRC:(Radio Resource Control):无线资源控制协议
- STM32工作笔记0044---什么是二极管什么是三极管
- 关于VB访问数据库的一些经验(献给VB初学者)
- stm32 带通滤波器_【安富莱——DSP教程】第37章 FIR滤波器的实现
- S3C2410原理图导读
- 诺基亚3d贪吃蛇java版_3D贪吃蛇诺基亚六边形
- 折叠面板的改进【Amaze UI】
- 【测试算法】深入浅出Pairwise 算法
- 2011届移动开发者大会
- C++的emplace_back函数介绍
- 时间戳,2038年计算机要面临的问题(代码演示)
- Linux九阴真经之无影剑残卷7(进程管理)