在余老大(http://blog.yufeng.info/)的指引下开始学习SystemTap了。
最近要追查MySQL中一个耗时函数的调用栈,刚好用到这个神器。在1.3版本中自带的tapset中有 print_ubacktrace 和 sprint_ubacktrace 这两个函数。输出的格式是 “函数名+地址 [进程名]“。 为了得到函数名,要作字符串处理。
早上在tapset中发现了另外一个函数print_ubacktrace_brief, 输出格式是 “函数名+地址”。
因此想到如果能有个函数只输出函数名就好了,依葫芦画瓢可以自定义函数如下。
function sprint_ubacktrace_func () %{
/* unprivileged */ /* pragma:uprobes */ /* pragma:vma */
assert_is_myproc();
/* use task_pt_regs, CONTEXT->regs might be kernel regs, or not set. */
if (current->mm)
{
struct pt_regs *uregs;
int valid;
if (CONTEXT->regs && (CONTEXT->regflags & _STP_REGS_USER_FLAG))
{
uregs = CONTEXT->regs;
valid = 1;
}
else
{
uregs = task_pt_regs(current);
valid = _stp_task_pt_regs_valid(current, uregs);
}
if (uregs)
{
_stp_stack_sprint (THIS->__retvalue, MAXSTRINGLEN, _STP_SYM_SYMBOL|_STP_SYM_POST_SPACE,
uregs, CONTEXT->pi, MAXTRACE,
current, CONTEXT->ri, valid);
return;
}
}
strlcpy (THIS->__retvalue, "", MAXSTRINGLEN);
%}
其实重点就是_stp_stack_sprint函数的第三个参数,自己定义不同的宏有不同的效果。简单例子中进程ex_stack调用顺序为 main -> p1 -> p2 -> p3 -> p4,则在 process(“ex_stack”).function(“p4”).call 中调用上面这个函数,返回值为
" p4 p3 p2 p1 main xxxx(空格隔开)"
直接显示省了字符串处理J
另外,脚本中使用这函数的话,记得带-g.
分享到:
相关推荐
C++ 获取函数调用堆栈的 高效实现代码
本节通过代码实例分析函数调用过程中栈帧的布局、形成和消亡。示例代码如下:该程序每个函数都嵌入汇编代码,以获取各函数运行时刻EBP和ESP寄存器的值。每个函数都打印出EBP寄存器所指向内存地址处的值,以及位于其...
以上包括tag,类名,函数名,参数,所在行数。 同时支持快速统计时间、打印调用栈 统计时间举例: xzw_time + 快捷键 打印调用栈举例: xzw_trace + 快捷键 源码github地址:...
4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数(键盘输入函数) 55 4.5 格式输入与输出 55 4.5.1 printf 函数(格式输出函数) 56 4.5.2 scanf函数(格式输入函数) 58 顺序结构程序设计举例 60 45 分支...
4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数(键盘输入函数) 55 4.5 格式输入与输出 55 4.5.1 printf 函数(格式输出函数) 56 4.5.2 scanf函数(格式输入函数) 58 顺序结构程序设计举例 60 45 分支...
13.9.1 在虚函数中调用成员函数 13.9.2 3种调用虚函数的方式比较 13.10被继承的虚函数仍然是虚函数 13.11系统是如何调用虚函数的 13.12在虚函数中使用成员名限定 13.13虚析构函数 13.14总结 第14章 数组 14.1 数组...
13.9.1 在虚函数中调用成员函数 13.9.2 3种调用虚函数的方式比较 13.10被继承的虚函数仍然是虚函数 13.11系统是如何调用虚函数的 13.12在虚函数中使用成员名限定 13.13虚析构函数 13.14总结 第14章 数组 ...
这些信息包括源代码、函数名、标签、全局变量、静态变量。有限度的支持动态(栈)变量和结构。 代码高亮 OllyDbg的反汇编器可以高亮不同类型的指令(如:跳转、条件跳转、入栈、出栈、调用、返回、特殊的或是无效的...
6.5.4 运行时动态获取DLL导出函数地址并调用 189 6.5.5 声明导出函数、创建lib库,为其他模块提供导入表调用接口 190 6.5.6 通过构建导入表调用DLL导出函数 191 第7章 线程同步 192 7.1 基本原理 192 ...
2. 一个类里可以同时存在[同一个类里无论什么函数都不能函数名和参数完全一样]参数和函数名都相同的虚函数与静态函数(错误) 3. 父类的析构函数是非虚的,但是子类的析构函数是虚的,delete子类指针(指向该子类对象...
14.8.1构造函数调用次序 14.8.2虚函数在构造函数中的行为 14.9析构函数和虚拟析构函数 14.10小结 14.11练习 第15章 模板和包容器类 15.1包容器和循环子 15.2模板综述 15.2.1C方法 15.2.2Smalltalk方法 15.2.3模板...
这些信息包括源代码、函数名、标签、全局变量、静态变量。有限度的支持动态(栈)变量和结构。 代码高亮: OllyDbg 的反汇编器可以高亮不同类型的指令(如:跳转、条件跳转、入栈、出栈、调用、返回、特殊的或是...
在C++中,允许有相同的函数名,不过它们的参数类型不能完全相同,这样这些函数就可以相互区别开来。而这在C语言中是不允许的。 1.参数个数不同 #include iostream.h void a(int,int); void a(int); int main...
3.2.3 调用函数的函数 73 3.2.4 返回布尔值的函数 75 3.2.5 定义void函数 76 3.2.6 void函数中的return语句 77 3.2.7 前提条件和执行结果 78 3.2.8 main函数 79 3.2.9 递归函数 79 3.3 作用域规则 80 3.3.1...
19_函数调用模型_主调函数和被调用函数 20_课堂答疑_函数调用流程入栈出栈过程 21_指针也是一种数据类型_基础 22_指针也是一种数据类型_强化_传智扫地僧 源码及文档 01_课程回顾 02_作业题强化和野指针 03_向null...
6.5.4 运行时动态获取DLL导出函数地址并调用 189 6.5.5 声明导出函数、创建lib库,为其他模块提供导入表调用接口 190 6.5.6 通过构建导入表调用DLL导出函数 191 第7章 线程同步 192 7.1 基本原理 192 ...
" "主函数调用杨辉三角输出函数,实现n行杨辉三角输出。 " "性质 " "设计性 " "实验学时 " "2学时 " "实验环境 " "C与C++程序设计学习与实验系统 " "实验内容及步骤 " "(一).内容 " "定义循环队列的存储结构,完成...