用systemtap跟踪打印动态链接库的所有c++函数调用过程
http://gmd20.blog.163.com/blog/static/168439232015475525227/
用systemtap跟踪打印动态链接库的所有c++函数调用过程
=================================================
1. ltrace 的问题
---------------
用ltrace 可以打印所有的so文件调用了。但上次试过如果so是自己用dlopen来加载的。
就是在elf结构里面没有对应的依赖项的情况下,ltrace好像是没有做对应的调用了。
用systemtap的就没有这个问题,打印输出也更灵活一些。
2. 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 命令来转换一下好了。
3. 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 stap
function 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")'
```
4. 写个简单的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;
用systemtap跟踪打印动态链接库的所有c++函数调用过程的更多相关文章
- 20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结
week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.gi ...
- 理解进程调度时机跟踪分析进程调度与进程切换的过程(Linux)
----------------------------------------------------------------------------------- 理解进程调度时机跟踪分析进程调度 ...
- mdl 锁 SYSTEMTAP跟踪
systemtap : 各种资源的使用限制由所生成的C代码中的宏来设置.这些值可在编译时由-D选项来重写.下面描述了部分挑选出来的宏: MAXNESTING 递归函数的最大调用层数,默认值是10. M ...
- sync fsync fdatasync ---systemtap跟踪
aa.stp: probe kernel .function ( "sys_sync" ) { printf ( "probfunc:%s fun:%s\n", ...
- systemtap跟踪C
1.[root@localhost ~]# rpm -qi glibcName : glibc Relocations: (not rel ...
- Linux内核分析之理解进程调度时机跟踪分析进程调度与进程切换的过程
一.原理分析 1.调度时机 背景不同类型的进程有不同的调度需求第一种分类I/O-bond:频繁的进行I/O:通常会花费很多时间等待I/O操作的完成CPU-bound:计算密集型:需要大量的CPU时间进 ...
- 通过gdb跟踪Linux内核装载和启动可执行程序过程
作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的:通过对一个简单的可执 ...
- 【实习记】2014-08-10(上)代码跟踪git的想法+归并排序的debug过程
(冒泡,选择,插入,希尔,快速,归并,堆排)周末加班学习C++,打算用C++写七大经典排序代码.发现3个月前自己写的七大经典排序代码(C Language)突然运行出错. Makefile内容 ...
- (转)logback 打印Mybitis中的sql执行过程
场景:在程序开发过程中经常需要跟踪程序中sql语句的执行过程,在控制台打印出sql语句和对应的参数传递就能够更快的定位错误! 原文出处:http://www.cnblogs.com/beiyeren/ ...
随机推荐
- bzoj5286 [Hnoi2018]转盘
题目描述: bz luogu 题解: 看了半个晚上终于明白了. 首先最优决策一定有:在起始点停留一段时间然后一直前进. 解释网上有很多,在这里不赘述了. (由于是环,先把$T$数组倍长.) 首先基于决 ...
- [POJ] 3362 Telephone Lines
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7978 Accepted: 2885 Descr ...
- Windows10系统可以禁止的服务(按名称排序)
1.Application LayerGateway Service(Windows必须禁止的10项服务) 2.Bluetooth Handsfree Service(没有蓝牙的用户可以关闭) 3.B ...
- (15)zabbix ODBC数据库监控
概述 ODBC监控对应于Zabbix Web管理端中的Database monitor监控项类型. ODBC是用于访问数据库管理系统(DBMS)的C语言中间件API.ODBC由Microsoft开发, ...
- SqlServer 2014该日志未截断,因为其开始处的记录是挂起的复制操作或变更数据捕获
环境:AlwaysOn集群 操作系统:Windows Server 2008 R2 数据库: SQL Server 2014 错误提示:“该日志未截断,因为其开始处的记录是挂起的复制操作或变更数据捕获 ...
- (转) 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文教程(精)
原文地址:http://blog.csdn.net/holydancer/article/details/9219333 概述: 苹果的证书繁锁复杂,制作管理相当麻烦,今天决定重置一个游戏项目中的所有 ...
- 【06】前端需要注意哪些SEO
[06]前端需要注意哪些SEO 01,合理的title,description,keywords. 02,语义化的HTML代码.好处,让搜索引擎更好搜索. 03,重要的HTML内容放前面. 04,重要 ...
- 为什么我打的jar包没有注解?
本文来自网易云社区 作者:王飞 一.前言 一切问题的起源就是来自一个问题"为什么我打的jar包没有注解?",带着这个疑问查了一圈资料,原来问题主要是在没有将源码中的注释进行抽取打包 ...
- linux下连接到远程主机,用图像界面(想在远程服务器上用cmake)
1. 需要通过SSH -X username@ip登陆服务器后,再用图形界面,比如用cmake 2.直接用 SSH username@ip命令登陆服务器后,不能用cmake
- 让Sublime Text成为静态WEB服务器:SublimeServer
如果你使用Sublime Text作为你的编辑器,那么在进行HTML和Java开发的时候有一个很有用的功能,帮你完成前端的联调测试,那就是Sublime Text的服务器插件:SublimeServe ...