addr2line 回复“问号”问题的解决和一些发现
我在尝试使用LTTng的prebuilt user space tracing helper
来自动插入trace point来监控函数的进出。
这一套东西的原理是利用gcc 的-finstrument-functions
参数,在函数的进出口插入hook,动态链接到liblttng-ust-cyg-profile.so
来提供被hook的代码用来发射event。
在记录的trace log 的field里。是以地址的形式记录进出口位置。
例如:
[17:58:51.390638416] (+0.000000542) PC lttng_ust_cyg_profile:func_exit: { cpu_id = 9 }, { addr = 0x5609DC20A642, call_site = 0x5609DC20ACA6 }
[17:58:51.390639034] (+0.000000618) PC lttng_ust_cyg_profile:func_entry: { cpu_id = 9 }, { addr = 0x5609DC20A1A4, call_site = 0x5609DC20ACB6 }
[17:58:51.390639560] (+0.000000526) PC lttng_ust_cyg_profile:func_exit: { cpu_id = 9 }, { addr = 0x5609DC20A1A4, call_site = 0x5609DC20ACB6 }
如果需要知道调用的是哪个函数,需要将地址翻译成符号名。用到addr2line
下面出现了惊喜一幕:
>>addr2line 0x5609DC20A1A4 -e tp_test -f -s -C
回复:
>>??
>>??:0
经过一番研究,发现需要添加几个编译链接参数,可解决问题:
- -g
编译时加-g
,可以在文件中保留调试信息。
*-rdynamic
链接时 添加 - rdynamic
用来通知链接器将所有符号添加到动态符号表中。
*-no-pie
What version of addr2line do you use? –
ssbssaDec 9, 2021 at 11:24
@ssbssa I'm using addr2line 2.34. –
ChrisZZDec 9, 2021 at 11:36
Now I see the problem, the newer executable has ASLR enabled, that's why the addresses are so high (0x55baa10213f1). So the debug information in the executable uses a different base address than the actual running executable. –
ssbssaDec 9, 2021 at 12:04
@ssbssa I'm now even more confused.. How can I disable ASLR temporarily for gcc? I tried gcc -fno-stack-protector -z execstack but not working. –
ChrisZZDec 9, 2021 at 12:45
Try compiling with -no-pie. –
ssbssaDec 9, 2021 at 13:43
@ssbssa Thank you! Actually before asking this question I tried with adding -fno-pie but didn't work. Now with full command ` gcc -g -rdynamic -no-pie x.c` it works! –
ChrisZZDec 10, 2021 at 0:59
高版本的GCC 默认使用了ASLR,ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。
这个也许是问题的根源。
在链接中加入-no-pie
来关闭PIE,来解决问题。我这里在编译和链接都加上了-no-pie。因为只在编译处加上似乎没有解决问题。
结果:
[17:58:51.390636664] (+0.000000529) PC lttng_ust_cyg_profile:func_exit: { cpu_id = 9 }, { addr = 0x5609DC20B191, call_site = 0x5609DC20AB02 }
[17:58:51.390637270] (+0.000000606) PC lttng_ust_cyg_profile:func_exit: { cpu_id = 9 }, { addr = 0x5609DC20AAD2, call_site = 0x5609DC20AC96 }
[17:58:51.390637874] (+0.000000604) PC lttng_ust_cyg_profile:func_entry: { cpu_id = 9 }, { addr = 0x5609DC20A642, call_site = 0x5609DC20ACA6 }
[17:58:51.390638416] (+0.000000542) PC lttng_ust_cyg_profile:func_exit: { cpu_id = 9 }, { addr = 0x5609DC20A642, call_site = 0x5609DC20ACA6 }
[17:58:51.390639034] (+0.000000618) PC lttng_ust_cyg_profile:func_entry: { cpu_id = 9 }, { addr = 0x5609DC20A1A4, call_site = 0x5609DC20ACB6 }
[17:58:51.390639560] (+0.000000526) PC lttng_ust_cyg_profile:func_exit: { cpu_id = 9 }, { addr = 0x5609DC20A1A4, call_site = 0x5609DC20ACB6 }
[17:58:51.390653259] (+0.000013699) PC lttng_ust_cyg_profile:func_entry: { cpu_id = 0 }, { addr = 0x404BF8, call_site = 0x403E48 }
[17:58:51.390654040] (+0.000000781) PC lttng_ust_cyg_profile:func_entry: { cpu_id = 0 }, { addr = 0x40480B, call_site = 0x404C30 }
[17:58:51.390654617] (+0.000000577) PC lttng_ust_cyg_profile:func_entry: { cpu_id = 0 }, { addr = 0x404341, call_site = 0x40483F }
[17:58:51.390655219] (+0.000000602) PC lttng_ust_cyg_profile:func_exit: { cpu_id = 0 }, { addr = 0x404341, call_site = 0x40483F }
因为我的程序链接了so库,所以可能库里的地址仍为随机地址,但是本程序中已经变为了可以使用的地址。
再尝试一次:
$ addr2line 0x404190 -e tp_test -f -s -C
std::chrono::duration<long, std::ratio<1l, 1000000000l> >::count() const
chrono:346
最后说一下lttng相关的:
Compile your application with compiler option -finstrument-functions.Launch your application by preloading liblttng-ust-cyg-profile-fast.so for fast function tracing:$ LD_PRELOAD=liblttng-ust-cyg-profile-fast.so my-app
Launch your application by preloading liblttng-ust-cyg-profile.so for slower, more verbose function tracing:$ LD_PRELOAD=liblttng-ust-cyg-profile.so my-app
addr2line 回复“问号”问题的解决和一些发现相关推荐
- java显示汉字乱码怎么办_java中的汉字显示问号乱码怎么解决
java中的汉字显示问号乱码怎么解决 发布时间:2020-06-23 22:16:38 来源:亿速云 阅读:97 作者:元一 java中的汉字显示问号乱码怎么解决?针对这个问题,今天小编总结了这篇文章 ...
- asp mysql 符号乱码_asp MYSQL出现问号乱码的解决方法
asp MYSQL出现问号乱码的解决方法 发布时间:2016-06-18 来源: 点击: 次 这样的问题是因为 数据库字符集,表字符集,字段字符集都设为:gbk_chinese_ci 注意数据库连接串 ...
- 10中文显示都是问号_CAD字体出现问号乱码的解决方法
阅读本文前,请您先点击上面的蓝色字体"绘图班",再点击"关注",这样您就可以继续免费收到最新文章了.每天都有分享.完全是免费订阅,请放心关注. 也许在工作中我们 ...
- cad图纸问号怎么转换文字_CAD打开图纸后字体显示为问号,这样解决治标治本(送)...
用CAD的朋友一般都会遇到这样一个问题,当我们打开一幅CAD图纸的时候,有时候在图形中本该显示文字的地方,文字没显示,却显示了一个"?",懂的朋友都知道,这是缺少相关字体文件,CA ...
- oracle查询数据都是问号,Oracle数据库PL/SQL Developer查询结果显示问号乱码的解决方法...
PL SQL Developer,查询结果中的中文变成了一堆问号,SQL语句中的中文被提示invalid character,不能识别. 解决方法: 执行,select userenv('langua ...
- linux下mysql写中文变成问号_如何解决数据库插入中文字体时显示问号
欢迎点击「算法与编程之美」关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 我们在进行数据库的增删改查的操作时,当我们插入英文或者 ...
- ubuntu终端中文显示问号或乱码解决办法
配置locale-gen 终端执行 sudo locale-gen zh_CN.UTF-8 配置完后检查中文显示是否正常,若仍然不正常执行第二步 配置语言环境变量 复制以下命令,终端执行 export ...
- Linux下oracle显示问号,Linux下oracle插入(导入)中文记录显示为问号问题及解决办法...
字符集 oracle官方关于字符集和NLS_LANG的解答:http://www.oracle.com/technology/tech/globalization/htdocs/nls_lang%20 ...
- java 中文问号问题_解决java中的中文乱码问题(ZT)
一般在传送时使用的encoding:使用GET 的方式: String test = new String((request.getParameter("test")).getBy ...
- 菱形问号乱码怎么解决
在控制面板--区域--管理--更改系统区域设置--beta版:使用unicode....提供全球语言支持·· 把打勾去掉就正常了
最新文章
- 数据结构与算法常用名词术语整理
- Oracle 数据库整理表碎片
- Leaflet中使用MovingMarker插件实现标记移动(轨迹回放效果)
- Python数据分析pandas之series初识
- .net 获取 存储过程的输出参数
- RPM 包相关命令详解
- 多串口服务器的工作方式及接线示意图介绍
- python bottle部署g_python bottle框架(WEB开发、运维开发)教程 | linux系统运维
- dubbo内置哪几种服务容器_Dubbo服务提供者几种启动方式
- 特斯拉拦不住蔚来取代BBA的心
- springmvc json结合
- monit监控mysql_monit监控工具(客户端)
- 省选专练[USACO18JAN]Stamp Painting
- 常用数据库高可用和分区解决方案(2) — MongoDB篇
- Unity3D中把AudioClip保存为Wav文件
- linux perl 执行java,如何从Java调用Perl?
- 大数据分析如何利用Python创建数据透视表
- Surface Book重装系统步骤
- 【博客话题】人在囧途之“运维囧”
- nexus5 博通芯片WIFI详解 (1)