用systemtap跟踪打印动态链接库的所有c++函数调用过程

May 07, 2015 | 1 Minute Read

  • ltrace 的问题
    用ltrace 可以打印所有的so文件调用了。但上次试过如果so是自己用dlopen来加载的。 就是在elf结构里面没有对应的依赖项的情况下,ltrace好像是没有做对应的调用了。 用systemtap的就没有这个问题,打印输出也更灵活一些。

  • systemtap的解析c++ 函数问题
    systemtap的 probe point 指定函数名,是支持c++ 方式指定名字的。 但默认的打印输出却只能输出函数名,不包含c++ 类名。

c++ 的函数符号是经过修饰的,比如用 nm *.so 查看就可以看到 _Z开头一大堆函数名字。

c++filt _ZZN9log4cplus19initializeLog4cplusEvE11initialized

log4cplus::initializeLog4cplus()::initialized

systemtap的 ppfunc () 函数只输出”initialized” systemtap的 probefunc () 函数输出 “_ZZN9log4cplus19initializeLog4cplusEvE11initialized” 其实我们想要的是 “log4cplus::initializeLog4cplus()::initialized” 但看一下文件是没有这个tapset函数的,估计的自己写一个才行。

还好有c++filt 这个命令,可以做c++ 函数名的demangle。 我们就可以简单用probefunc 打印 然后在自己用c++filt 命令来转换一下好了。

  • systemtap的函数调用跟踪
    systemtap的资料就有一个 para-callgraph.stp ,根据自己的要求做修改吧。

我是这样用的,打印所有libTest.so 源码文件 .hpp *.cpp 的所有函数, 也就是只有c++的函数。 其实用来跟踪c函数调用那些用起来更好用吧,都不用做c++ 函数名转换了。根据自己要求来设置跟踪哪些函数吧。 stap para-callgraph.stp ‘process(“/usr/lib/libTest.so”).function(“@*pp”)’ ‘process(“/usr/lib/libTest.so”).function(“Init”)’ > trace_file.txt

#! /usr/bin/env stapfunction trace(entry_p, extra) {/* %( $# > 1 %? if (tid() in trace) %) */%( $# > 1 %? if (2 > 1) %)printf("%s%s%s %s\n",thread_indent (entry_p),(entry_p>0?"->":"<-"),/* ppfunc (),  只有函数名,没有包含类名*/probefunc (),extra)
}%( $# > 1 %?
global trace
probe $2.call {trace[tid()] = 1
}
probe $2.return {delete trace[tid()]
}
%)probe $1.call   { trace(1, $$parms) }
probe $1.return { trace(-1, $$return) }// 第一个参数是跟踪的打印的函数,第二个参数是触发记录的函数。
// https://sourceware.org/systemtap/langref/Probe_points.html#SECTION00051300000000000000
// probe_point = <function name@filename:line_number>
// stap para-callgraph.stp 'kernel.function("*@fs/*.c")' 'kernel.function("sys_read")':
// stap para-callgraph.stp  'process("/usr/lib/libtest.so").function("*")' 'process("/usr/lib/libtest.so").function("TestInit")'
// stap para-callgraph.stp  'process("/usr/lib/libtest.so").function("*@*cpp")' 'process("/usr/lib/libtest.so").function("TestInit")'
// stap para-callgraph.stp  'process("/usr/lib/libtest.so").function("*@*cpp:*")' 'process("/usr/lib/libtest.so").function("TestInit")'
// stap para-callgraph.stp  'process("/usr/lib/libtest.so").function("*@*cpp:1-200")' 'process("/usr/lib/libtest.so").function("TestInit")'
  • 写个简单的perl脚本来调用c++filt 来做函数名转换
#!/usr/bin/perl -w
use strict;open(INFILE, "trace_file.txt");
open(OUTFILE, ">trace_file_2.txt");my $line;
while ($line = <INFILE>){if ($line =~ /boost|Trace/) {next;}if ($line =~ /(.*)(_Z\S+)(.*)/) {my $function_name = `c++filt $2`;chomp($function_name);print OUTFILE  $1, $function_name, $3, "\n";} else {print OUTFILE $line;}
}close INFILE;
close OUTFILE;

原文:https://gmd20.github.io/blog/用systemtap跟踪打印动态链接库的所有c++函数调用过程/

用systemtap跟踪打印动态链接库的所有c++函数调用过程相关推荐

  1. 20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结...

    week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.gi ...

  2. html将变量打印到屏幕_用可视化过程解释代码运行过程和变量作用空间

    直接语言讲解和代码打印仍然不够直观,所以可以借助 2 个工具,一个是 Python Tutor 代码可视化工具:http://pythontutor.com/visualize.html#mode=e ...

  3. 理解进程调度时机跟踪分析进程调度与进程切换的过程

    虞啸川 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux既支持 ...

  4. 浮点数打印其实是个复杂的过程

    http://www.bubuko.com/infodetail-636638.html 这个帖子写的比较好,不过格式有点乱. 我得花时间再研究下. 感谢语言做了封装,要不然光从内存读完数据打印到屏幕 ...

  5. 实验八---理解进程调度时机跟踪分析进程调度与进程切换的过程

    实验目的: 使用gdb跟踪分析一个schedule()函数,理解Linux系统中进程调度的时机. 实验过程: 登陆实验楼虚拟机http://www.shiyanlou.com/courses/195 ...

  6. 使用计算机打印汉字文档是什么过程,电脑打印文字字体出现乱码的解决方法

    电脑打印文字字体出现乱码该怎么解决?在打印机在打印文件时,打印输出的文字字体全部出现乱码,而此时别的计算机上使用打印机是正常的.对于这个问题该怎么解决呢?下面小编就为大家详细地介绍一下吧. 步骤: 1 ...

  7. Linux内核分析--理解进程调度时机、跟踪分析进程调度和进程切换的过程

    学号后三位:426  原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 1.进程的创建 除了0号进程(系统创建的)之外,linux系统中都是 ...

  8. linux调用一个函数失败 打印错误,linux下settimeofday函数调用失败,何故?解决办法...

    当前位置:我的异常网» C语言 » linux下settimeofday函数调用失败,何故?解决办法 linux下settimeofday函数调用失败,何故?解决办法 www.myexceptions ...

  9. Linux性能优化学习

    1. 什么是操作系统实时性,有哪几种比较常用的? 实时的概念是不一定是速度要快,是要保证任务完成的时间.让关键的操作能够在所保证的时间之内完成. 实时分为: 软实时(体验的质量有所下降,不是必须选项) ...

最新文章

  1. 汇总pandas中dataframe的删除操作
  2. html 文字倒映效果,HTML图片CSS滤镜—倒影效果
  3. 第三周总结CoreIDRAW
  4. python设计拼图小游戏_教你用Python自制拼图小游戏,轻松搞定熊孩子
  5. 2019年1月14日【第一天正式学习】
  6. 文件查找-locate find 学习笔记
  7. 成功驱动5150用HT68F30
  8. php创建表设置编码,教您在Zend Framework里如何设置数据库编码以及怎样给数据表设定前缀!...
  9. android 标题样式,Android定义各种样式的标题栏:requestWindowFeature()
  10. 红橙Darren视频笔记 模板模式的应用与BaseActivity
  11. Unity Shader:Waveform波形(3)-复合波
  12. python教程视频-Python基础视频教程(600集)【传智播客精品教程】
  13. VC与VS的版本对应关系,VC到底是什么?为啥总提示缺少VC
  14. python足球数据分析_我用Python对科比NBA生涯进行了一个数据分析
  15. WPS OFFICE
  16. 万能平板刷机软件_万能手机刷机软件下载
  17. 计算机网络图标不见了,电脑网络图标不见了怎么恢复
  18. discuz php单页,Discuz! 单页制作教程
  19. Seaborn实战案例 | 绘制分类条形统计图
  20. 服务器appcrash的问题怎么修复,Win7系统出现APPCRASH错误的修复方法

热门文章

  1. 浏览器渲染页面的原理
  2. swift版左右侧滑菜单
  3. SpringBoot--maven-wrapper(mvnw)--使用/详解
  4. 《Python数据分析与挖掘实战》第12章(中)——协同推荐
  5. tp5.1 乐百分支付(分期)
  6. 你身边有个这样的「小黄」么?
  7. 【面试-经验之谈】面霸是如何养成的,他的路子真的野
  8. springmvc配置过滤器
  9. 如何学习别人的代码(代码量较大时)
  10. 电大大专本科怎么考,国家是否承认