用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/ ...
随机推荐
- ios之UIScrollView
UIScrollView 类负责所有基于 UIKit 的滚动操作. 一.创建 [java] view plaincopy CGRect bounds = [ [ UIScreen mainSc ...
- Qt读写excel
今天在利用Qt进行excel操作时,代码总是走到打开excel这一步是总是出现程序崩溃.在网上查找了各种帖子 说法不一,尝试都没有解决.后来猜想是不是excel没有激活影响的.发现自己的excel没 ...
- __new__.py
def func(self): print('hello %s' %self.name)def __init__(self,name,age): self.name = name self.age = ...
- MariaDB数据库(三)
1. 基本查询 查询基本使用包括:条件.排序.聚合函数.分组和分页. 实例详解查询 1> 创建students表用作实验 MariaDB [testdb]> drop table stud ...
- touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
docker 运行后, 执行docker logs -f myjenkins时报错: touch: cannot touch ‘/var/jenkins_home/copy_reference_fil ...
- CM3中数据传输对齐/非对齐方式
在CM3中,非对齐的数据传输只发生在常规的数据传送指令中,如LDR.LDRH.LDRSH.其他指令则不支持,包括: 1.多个数据的加载.存储(LDM/STM). 2.堆栈操作PUSH.POP. 3.互 ...
- django第13天(auth组件,forms组件,中间件,csrf)
django第13天(auth组件,forms组件) auth组件 -auth组件 -auth是什么? -django内置的用户认证系统,可以快速的实现,登录,注销,修改密码.... -怎么用? -( ...
- mysql常见监控项
1.MySQL服务运行状态 约定所有MySQL服务都必须以ip1(内网ip)来绑定,每个机器只有一个ip1,可以有多个端口,即多个MySQL Server.采集程序读取ip端口信息文件来判断serve ...
- UVa 11987 并查集 Almost Union-Find
原文戳这 与以往的并查集不同,这次需要一个删除操作.如果是叶子节点还好,直接修改父亲指针就好. 但是如果要是移动根节点,指向它的所有子节点也会跟着变化. 所以要增加一个永远不会被修改的虚拟根节点,这样 ...
- Hive元数据启动失败,端口被占用
org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0. ...