简介

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使用相关推荐

  1. linux64位系统兼容32位程序(不下载兼容包)

    64位系统兼容32位系统,正常通过apt指令安装兼容包即可.也就是两条命令的事情: apt-get install gcc-multilib apt-get install g++-multilib ...

  2. 深度linux64位系统下载,深度操作系统下载 deepin深度操作系统 15.10 正式版 64/32位 下载-脚本之家...

    deepin深度操作系统官网已经发布了深度操作系统15.10的发布下载. 深度操作系统V15.10修复了已知的各种问题,并对现有的部分功能进行了优化和改进,深度操作系统V15.10基于Debian s ...

  3. linux64位系统需要安装32位mysql_在Ubuntu16.04 Linux 64位环境下安装二进制版本MySQL 8.0.13...

    a.MySQL依赖于libaio库.如果此库不在本地安装,则数据目录初始化和随后的服务器启动步骤将失败.如果需要,请使用适当的包管理器安装它.例如,基于云计算的系统: hell> apt-cac ...

  4. u盘linux64位系统下载,UNetbootin(最新U盘启动盘制作工具) X64位 V6.6.1 Linux版

    UNetbootin是一款U盘启动盘制作工具,它能够帮助用户制作U盘启动盘,它可以通过下载ISO(CD映像)文件或使用已经下载的ISO文件来加载发行版. [如何使用] 1.U盘启动的制作: 使用une ...

  5. 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 ...

  6. amd cpu跑linux64,给新手提醒:amd的cpu绝大部分支持64位系统。

    jagub 于 2009-06-10 09:10:06发表: 引用: 但是换系统很麻烦的,,,,所以我正在犹豫,先用我的arch吧,用着挺顺手的,等着我再自己搭建环境吧,反正就是装软件包的事. 微宝贝 ...

  7. 记实现TDengine时序数据库支持 .Net Windows 32位系统踩坑

    TDengine是一个高效的存储.查询.分析时序大数据的平台,专为物联网.车联网.工业互联网.运维监测等优化而设计的数据库, 官方目前没有提供完整的.Net Core 解决方案, 因此闲来无事, 从基 ...

  8. vc++64位系统下long的长度为4个字节_64位系统究竟牛逼在哪里?

    想必大家都遇到过这样的问题:安装某个软件的时候,出现提示选择32位版本还是64位版本?我们也可以查看自己的电脑是32位还是64位系统. Windows Linux 大家可能知道32位和64位和系统有关 ...

  9. 32位java 最大内存_【答疑系列】为什么32位系统只支持最大4G内存?

    这个问题一直都有同学问到,算是提问次数最多的问题之一了. 32位是什么 现在主流的操作系统都是64位的,早期存在32位操作系统,相信大家也都有所听闻,其实,在更早之前,还有16位.8位的,这里就不展开 ...

  10. 计算机32位操作系统最大识别到内存,win7 32位系统可以支持多大的内存_win7 的32位系统最大支持多少g的内存...

    大家都知道win7系统有32位和64位之分,而两者的安装配置是不一样的,一般4G内存的我们安装64位的系统,但是很多用户不知道win7 32位系统可以支持多大的内存,这就给大家分享一下win7 的32 ...

最新文章

  1. 【FFmpeg】AVOutputFormat/AVInputFormat 成员变量 flags 总结
  2. 单商户商城与多商户商城的区别
  3. React+TypeScript练手小项目
  4. Javascript获取当月的天数
  5. python常见的排序算法_常见排序算法之python实现
  6. 简单介绍Kubernetes
  7. System类、包装类、Math类、Random、Arrays工具类
  8. 1.15-1.16 sqoop action
  9. srsLTE源码学习:RRC:(Radio Resource Control):无线资源控制协议
  10. STM32工作笔记0044---什么是二极管什么是三极管
  11. 关于VB访问数据库的一些经验(献给VB初学者)
  12. stm32 带通滤波器_【安富莱——DSP教程】第37章 FIR滤波器的实现
  13. S3C2410原理图导读
  14. 诺基亚3d贪吃蛇java版_3D贪吃蛇诺基亚六边形
  15. 折叠面板的改进【Amaze UI】
  16. 【测试算法】深入浅出Pairwise 算法
  17. 2011届移动开发者大会
  18. C++的emplace_back函数介绍
  19. 时间戳,2038年计算机要面临的问题(代码演示)
  20. Linux九阴真经之无影剑残卷7(进程管理)

热门文章

  1. java生成简单流水号
  2. html+css唯美登录页面,代码提供(效果展示)
  3. matlab中卡尔曼滤波,卡尔曼滤波算法及MATLAB实现
  4. 【STM32】HAL库 STM32CubeMX系列学习教程
  5. 移动端服务器端身份证识别介绍
  6. python制作动态的微信个人名片
  7. Eclipse下搭建安卓开发环境(初步)
  8. php解析抖音视频链接,PHP抖音视频无水印解析接口
  9. SpringBoot_MD5加密工具类
  10. 给 TA 的一封匿名信-匿名信箱,一封来信,你的一封来信,一封Ta的来信,爆火的匿名信H5源码功能开发和分析,表白祝福道歉短信发送系统