我在尝试使用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 回复“问号”问题的解决和一些发现相关推荐

  1. java显示汉字乱码怎么办_java中的汉字显示问号乱码怎么解决

    java中的汉字显示问号乱码怎么解决 发布时间:2020-06-23 22:16:38 来源:亿速云 阅读:97 作者:元一 java中的汉字显示问号乱码怎么解决?针对这个问题,今天小编总结了这篇文章 ...

  2. asp mysql 符号乱码_asp MYSQL出现问号乱码的解决方法

    asp MYSQL出现问号乱码的解决方法 发布时间:2016-06-18 来源: 点击: 次 这样的问题是因为 数据库字符集,表字符集,字段字符集都设为:gbk_chinese_ci 注意数据库连接串 ...

  3. 10中文显示都是问号_CAD字体出现问号乱码的解决方法

    阅读本文前,请您先点击上面的蓝色字体"绘图班",再点击"关注",这样您就可以继续免费收到最新文章了.每天都有分享.完全是免费订阅,请放心关注. 也许在工作中我们 ...

  4. cad图纸问号怎么转换文字_CAD打开图纸后字体显示为问号,这样解决治标治本(送)...

    用CAD的朋友一般都会遇到这样一个问题,当我们打开一幅CAD图纸的时候,有时候在图形中本该显示文字的地方,文字没显示,却显示了一个"?",懂的朋友都知道,这是缺少相关字体文件,CA ...

  5. oracle查询数据都是问号,Oracle数据库PL/SQL Developer查询结果显示问号乱码的解决方法...

    PL SQL Developer,查询结果中的中文变成了一堆问号,SQL语句中的中文被提示invalid character,不能识别. 解决方法: 执行,select userenv('langua ...

  6. linux下mysql写中文变成问号_如何解决数据库插入中文字体时显示问号

    欢迎点击「算法与编程之美」关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 我们在进行数据库的增删改查的操作时,当我们插入英文或者 ...

  7. ubuntu终端中文显示问号或乱码解决办法

    配置locale-gen 终端执行 sudo locale-gen zh_CN.UTF-8 配置完后检查中文显示是否正常,若仍然不正常执行第二步 配置语言环境变量 复制以下命令,终端执行 export ...

  8. Linux下oracle显示问号,Linux下oracle插入(导入)中文记录显示为问号问题及解决办法...

    字符集 oracle官方关于字符集和NLS_LANG的解答:http://www.oracle.com/technology/tech/globalization/htdocs/nls_lang%20 ...

  9. java 中文问号问题_解决java中的中文乱码问题(ZT)

    一般在传送时使用的encoding:使用GET 的方式: String test = new String((request.getParameter("test")).getBy ...

  10. 菱形问号乱码怎么解决

    在控制面板--区域--管理--更改系统区域设置--beta版:使用unicode....提供全球语言支持·· 把打勾去掉就正常了

最新文章

  1. 数据结构与算法常用名词术语整理
  2. Oracle 数据库整理表碎片
  3. Leaflet中使用MovingMarker插件实现标记移动(轨迹回放效果)
  4. Python数据分析pandas之series初识
  5. .net 获取 存储过程的输出参数
  6. RPM 包相关命令详解
  7. 多串口服务器的工作方式及接线示意图介绍
  8. python bottle部署g_python bottle框架(WEB开发、运维开发)教程 | linux系统运维
  9. dubbo内置哪几种服务容器_Dubbo服务提供者几种启动方式
  10. 特斯拉拦不住蔚来取代BBA的心
  11. springmvc json结合
  12. monit监控mysql_monit监控工具(客户端)
  13. 省选专练[USACO18JAN]Stamp Painting
  14. 常用数据库高可用和分区解决方案(2) — MongoDB篇
  15. Unity3D中把AudioClip保存为Wav文件
  16. linux perl 执行java,如何从Java调用Perl?
  17. 大数据分析如何利用Python创建数据透视表
  18. Surface Book重装系统步骤
  19. 【博客话题】人在囧途之“运维囧”
  20. nexus5 博通芯片WIFI详解 (1)

热门文章

  1. 判断一个数是否为素数
  2. 【网络编程】【SCTP】SCTP协议介绍,四次握手,三次挥手
  3. 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 G题 数学思维
  4. 跳频技术——学习总结(一)
  5. python生成图片验证码
  6. 能编辑pdf文件的软件
  7. 阿里云大学诚邀各界”人工智能”专家共建人工智能方向人才培养生态!
  8. 联想笔记本电脑换掉原装系统后无法进BIOS不完美解决办法
  9. 阿铭Linux_网站维护学习笔记201903022
  10. 在普通用户下进入root用户