在做性能profile的时候,直观上感觉应该在profile的时候只记录基本数据,在最终记录完成后一次性进行符号解析,防止对系统性能造成影响。
所以写的probe脚本是这样的:
systemtap script:
global bts; // backtraces
probe timer.profile {
if (pid() == target()) {
bts[ubacktrace()] ++; // record every tick when in specific process
}
}
probe timer.s(5) {
exit(); // exit after 5 seconds
}
probe end {
foreach (count = bt in bts-) {
print_usyms(bt);
printf("\t%d\n", count);
}
}
但实际使用过程中,print_usyms()总是无法将符号解析出来。
怀疑stap命令行参数出错,将stap manual看了一遍又一遍,将-d/-ldd/--skip-badvars/--all-modules这些只要看着相关的参数一个个都加上了,还是不行。
怀疑stap版本太低,编译了最新版本也不行。
怀疑probe end时符号信息已经不存在了,在probe timer.profile中进行输出:
global bts;
global requestquit;
global quit;
probe begin {
requestquit = 0;
quit = 0;
}
probe timer.profile {
if (!requestquit) {
if (pid() == target()) {
bts[ubacktrace()] ++
}
} else {
if (!quit) {
quit = 1;
foreach (count = bt in bts-) {
print_usyms(bt);
printf("\t%d\n", count);
}
exit();
}
}
probe timer.s(5) {
requestquit = 1;
}
满怀信心去尝试,沮丧地发现还是不行。
最终忽然想到,timer类打点都是异步的,大部分timer.profile打点时(也就是每一个jiffy时钟中断发生时),当前cpu很可能没有执行到target()进程,这样print_usyms/print_ustack很可能拿不到当前进程的符号信息。print_usyms应该在pid()==target()时执行才能展示该进程的符号信息!再改:
global bts
global requestquit
global quit
probe begin {
requestquit = 0
quit = 0
}
probe timer.profile {
if (pid() == target()) {
if (!requestquit) {
bts[ubacktrace()] ++
} else {
if (!quit) {
quit = 1;
foreach (count = bt in bts-) {
print_syms(bt);
printf("\t%d\n", count);
}
exit();
}
}
}
}
probe timer.s(5) {
requestquit = 1
}
哈哈,搞定。
总结两点经验教训:
1. timer类异步事件发生时,cpu很可能没有在执行你希望观测的进程。实际上对于被监测的把单核占满的测试程序,在6核机器上,timer.profile只有1/4~1/3的打点是在target进程中的。
2. 当解析用户态符号时,如果当前上下文不是被观测的进程,则无法解析。
相关推荐
本文主要介绍在ubuntu平台 + 自定义内核上如何安装systemtap工具包及解决编译加载运行过程中的一些问题,如何利用systemtap工具监测分析内核函数,内核模块及用户态程序。
systemtap是什么?如何通过systemtap对应用程序内核程序进行调试?如何编写运行systemtap脚本?
SystemTap_Beginners_Guide
很全面详细的讲解了systemtap脚本编写基础语法,很好的入门文档
systemtap script examples , cross compile from x86 to arm.
systemTap英文文档集合.7z
SystemTap_Beginners_Guide.pdf
systemtap的入门指南,包含tracing/analysis/tapsets等,入门必备
systemtap交叉编译,运行于android平台。OMAP项目的实例,很有借鉴价值。
systemtap_tutorial
SystemTap是一个全新的工具,但已经表现出了强大的功能和广泛的适用性。...随着越来越多用户的体验,越来越多的bug会被报告和修正,越来越多的新功能会被添加,SystemTap也会变得 越来越稳定和完善。
Language Reference.pdf // 详细说明systemtap脚本的语法规则 Tapset Refernce Manual.pdf // 脚本库,详细说明每个function的功能 tutorial.pdf // systemtap 脚本初级教材,介绍脚本的一些用途 Beginners_Guide....
systemtap使用说明,英文版,包括简单用例,和实现方式,探测实现方式
学习Linux性能优化必不可少的工具sytemtap。想学习的同学可以下载。
linux 调试神器,linux 调试神器,linux 调试神器,linux 调试神器
SystemTap可以跟踪内核函数和用户态进程,当我们跟踪用户态进程时,需要使用其process模块。 查找函数符号 很多情况下,代码在执行时,其函数符号并不一定是代码中写的名称,因此我们可以使用以下脚本打印 出应用...
用systemtap研究内核 用systemtap研究内核 用systemtap研究内核 用systemtap研究内核 用systemtap研究内核
node-stap, 使用SystemTap分析 node.js 程序的工具 概要用于... 使用SystemTap收集和执行JavaScript重发,通过遍历V8堆栈和堆来提取人读名。 使用包装器脚本和节点 stackvis 生成文本或者 HTML flamegraphs 。 还可以