https://baoz.net/using-systemtap/
http://nanxiao.me/category/%E6%8A%80%E6%9C%AF/systemtap-%E7%AC%94%E8%AE%B0/
http://gmd20.blog.163.com/blog/static/168439232015475525227/
http://zhengheng.me/page/3/
http://www.golaravel.com/php/features.dtrace.systemtap.html
http://www.golaravel.com/php/features.dtrace.dtrace.html
http://www.golaravel.com/laravel/docs/5.1/
http://user.yeeyan.org/u/seth

SystemTap is commonly used to probe or trace kernel space system or function calls. Excellent examples are at
https://sourceware.org/systemtap ... temtap-scripts.html

Beginning with certain Linux kernel level, the uprobes kernel module allows SystemTap to probe user space processes. Newer kernel has uprobes module instead. Make sure you have one of the modules configured:

grep CONFIG_UTRACE /boot/config-`uname -r`
grep CONFIG_UPROBES /boot/config-`uname -r`

Other people have used SystemTap to probe Oracle user processes. See examples at
https://sourceware.org/systemtap/wiki/HomePage
Find (press ^F) "oracle" in browser to see them. But they all require that you already know the specific function to probe, such as kslwtbctx that signifies the beginning of a wait event.

Here, I'll use the para-callgraph.stp script from
https://www.sourceware.org/syste ... /paracallgraph.html
to probe Oracle server processes with no prior knowledge of which function to probe; I just want to see what function is called. Since I don't intend to pass the 2nd optional argument (used as trigger), I simplify the para-callgraph.stp script by removing the conditional compilation lines as follows (I renamed the filename to cg.stp to save typing):

# cat cg.stp
#! /usr/bin/env stap

function trace(entry_p, extra) {
printf("%s%s%s %s\n",
thread_indent (entry_p),
(entry_p>0?"->":"<-"),
ppfunc (),
extra)
}

probe $1.call { trace(1, $$parms) }
probe $1.return { trace(-1, $$return) }

Let's say I want to probe all Oracle server processes calling functions named like kks*:

# stap cg.stp 'process("/u01/app/oracle/product/11.2.0/db/bin/oracle").function("kks*")'
0 oracle(5588):->kksCompileCallNotifier
17 oracle(5588):<-kksCompileCallNotifier
0 oracle(5860):->kksMapCursor
16 oracle(5860):<-kksMapCursor
0 oracle(5860):->kksMapCursor
5 oracle(5860):<-kksMapCursor
^C

Two processes were captured calling kksCompileCallNotifier and kksMapCursor functions, respectively.

We can limit the probe to a specific process with -x option:

# stap cg.stp 'process("/u01/app/oracle/product/12c/db/bin/oracle").function("kks*")' -x 62148
0 oracle_62148_sa(62148):->kksMapCursor
43 oracle_62148_sa(62148): ->kksParentCursor
64 oracle_62148_sa(62148): <-kksParentCursor
71 oracle_62148_sa(62148): ->kksParentCursor
81 oracle_62148_sa(62148): <-kksParentCursor
90 oracle_62148_sa(62148):<-kksMapCursor
0 oracle_62148_sa(62148):->kksCloseCursor
19 oracle_62148_sa(62148): ->kksGetStats
36 oracle_62148_sa(62148): <-kksGetStats
47 oracle_62148_sa(62148): ->kksdip
64 oracle_62148_sa(62148): <-kksdip
89 oracle_62148_sa(62148): ->kksIsVPDCursorSessionCacheable
106 oracle_62148_sa(62148): <-kksIsVPDCursorSessionCacheable
121 oracle_62148_sa(62148):<-kksCloseCursor
0 oracle_62148_sa(62148):->kksMapCursor
^C

One issue is that because the oracle binary has tens of thousands of global and local functions (check with `nm $ORACLE_HOME/bin/oracle | egrep ' [Tt] ' | wc -l), if you simply pass * as the argument to function, stap hogs the CPU for a long time to enumerate the functions and no probe will be done. You have to limit the functions to a small set. My test shows that even trying to probe kk*, not alone k*, takes stap too long to prepare and I have to abort. Focusing on function main can be a start:

stap cg.stp 'process("/u01/app/oracle/product/11.2.0/db/bin/oracle").function("main")'

If you probe other binaries, such as sqlplus or tnslsnr or lsnrctl, passing * is fine. They don't contain too many functions.

Due to this issue, I didn't quite achieve the goal of "want to see what function is called", because I can't pass a simple * and have to qualify it to some extent.

Another issue is that $$parms and $$return, the two so-called pretty printing target variables, are always null for me. If they worked, they would show function parameters and function return value, respectively. See https://sourceware.org/systemtap ... rgetprettyprinting. I was able to use ulong_arg or s64_arg function to get a specific argument (e.g. the first one) in number format, e.g.

function trace(entry_p, extra) {
printf("%s%s%s %ld\n",
thread_indent (entry_p),
(entry_p>0?"->":"<-"),
ppfunc (),
extra)
}
function trace2(entry_p) {
printf("%s%s%s\n",
thread_indent (entry_p),
(entry_p>0?"->":"<-"),
ppfunc ())
}

//probe $1.call { trace(1, ulong_arg(1)) }
probe $1.call { trace(1, s64_arg(1)) }
probe $1.return { trace2(-1) }

I have to omit the second argument of the trace function used by return so I changed it to trace2. The result is

0 oracle(5588):->kksCompileCallNotifier 2
10 oracle(5588):<-kksCompileCallNotifier
0 oracle(5860):->kksMapCursor 139787894174976
9 oracle(5860):<-kksMapCursor
^C

systemtap-与 oracle 转的更多相关文章

  1. Life of an Oracle I/O: tracing logical and physical I/O with systemtap

    https://db-blog.web.cern.ch/blog/luca-canali/2014-12-life-oracle-io-tracing-logical-and-physical-io- ...

  2. 使用动态跟踪技术SystemTap监控MySQL、Oracle性能

    [IT168 技术]本文根据吕海波2018年5月11日在[第九届中国数据库技术大会]上的演讲内容整理而成. 讲师介绍: 吕海波,美创科技研究员,ITPUB管理版版主.出版技术书籍<Oracle内 ...

  3. oracle systemtap tracing

    https://github.com/LucaCanali?tab=repositories https://github.com/LucaCanali/Linux_tracing_scripts/t ...

  4. systemtap dtrace与 oracle

    https://fritshoogland.wordpress.com/page/3/ http://externaltable.blogspot.com/2013/06/dtrace-explora ...

  5. 动态追踪技术(中) - Dtrace、SystemTap、火焰图

    http://openresty.org/cn/presentations.html http://weibo.com/agentzh?is_all=1 http://openresty.org/po ...

  6. 内核调试神器SystemTap — 简介与使用(一)

    a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 简介 SystemTap是我目前所知的最强大的内核调试工具,有些家伙甚至说 ...

  7. linux 内核分析工具 Dtrace、SystemTap、火焰图、crash等

    << System语言详解 >> 关于 SystemTap 的书. 我们在分析各种系统异常和故障的时候,通常会用到 pstack(jstack) /pldd/ lsof/ tc ...

  8. Linux Perf Probes for Oracle Tracing

    Luca Canali on 21 Jan 2016 Topic: this post is about Linux perf and uprobes for tracing and profilin ...

  9. Linux BPF/bcc for Oracle Tracing

    Luca Canali on 26 May 2016 Topic: In this post you will find a short discussion and pointers to the ...

随机推荐

  1. effective c++:virtual函数在构造函数和析构函数中的注意事项

    如不使用自动生成函数要明确拒绝 对于一个类,如果你没有声明,c++会自动生成一个构造函数,一个析构函数,一个copy构造函数和一个copy assignment操作符. class Empty { p ...

  2. PHP 碎片

    1. $_SERVER['REMOTE_ADDR'] cannot be modified by the user or via HTTP so you CAN trust it. -- 用这个可以有 ...

  3. 【原创】MapReduce编程系列之二元排序

    普通排序实现 普通排序的实现利用了按姓名的排序,调用了默认的对key的HashPartition函数来实现数据的分组.partition操作之后写入磁盘时会对数据进行排序操作(对一个分区内的数据作排序 ...

  4. 加固Samba安全三法

    欢迎大家给我投票: http://2010blog.51cto.com/350944 650) this.width=650;" onclick='window.open("htt ...

  5. openstack-dbs

    真正的服务器派生出线程 和子进程处理多个连接当允许客户端加入聊天室,他发送的任何一条文本都将广播给聊天室中的每个用户,除非文本是服务器CLI当广播一条消息,消息前面将加上发送者的昵称 以尖括号括住昵称 ...

  6. linux中ctrl+z和ctrl+c的区别

    ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.ctrl+c是强制中断程序的执行,而ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用f ...

  7. 【MySql】权限不足导致的无法连接到数据库以及权限的授予和撤销

    [环境参数] 1.Host OS:Win7 64bit 2.Host IP:192.168.10.1 3.VM: VMware 11.1.0 4.Client OS:CentOS 6 5.Client ...

  8. centos下apache安装后无法访问

    2013.11.28遇到的问题: -------------------------------------- 一.centos下apache安装后无法访问 得查一下防火墙的问题 iptables添加 ...

  9. 浅谈iOS IPv6-only 新规

    5月份苹果发布新规,对于开发人员只需要做到以下几点就能顺利上线啦! 1.苹果从6月1日起,提供App Store审核的应用必须要兼容面向硬件识别和网络路由的最新互联网协议--IPv6-only标准.也 ...

  10. OSG+MFC对话框程序

    OSG的sample里面有OSG+MFC+MDI的例子. 网上有说OSG+MFCSDI的例子,如http://blog.csdn.net/xuguangsoft/article/details/816 ...