1.systemtap从入门到放弃(一)
2.SystemTapå·¥å
·ç使ç¨åºç¡
3.SystemTap GUI特点
4.在ESTABLISHED状态时,源码连接收到SYN会回复什么?
5.å¦ä½å¨ Oracle Linux ä¸ä½¿ç¨ PHP DTrace
systemtap从入门到放弃(一)
内核调试利器:systemtap从入门到放弃(一)
systemtap,安装一个用于简化Linux系统运行形态信息收集的源码开源工具,立足于性能诊断与bug调试。安装相较于繁琐的源码工具、耗时的安装jquery验证表单源码重新编译与引导过程,systemtap以动态hook内核代码的源码特性,提供了便捷的安装解决方案。其工作原理与底层kprobe接口紧密相连,源码通过在kprobe基础上引入脚本解析与内核模块编译运行单元,安装使开发人员得以在应用层实现对内核的源码hook,简化了开发流程。安装
相比传统的源码kernel API与debugfs接口,systemtap提供了更加简洁的安装命令行接口与内核指令脚本语言,对于开发者而言,源码它成为了一款极其实用的工具,尤其在bug调试、性能分析与源码学习方面。
入门systemtap,网页源码下载歌曲首先需了解其独特的脚本语法。脚本的编写,就是找到所需事件并设计事件处理流程的过程。系统中常用的语法元素包括脚本命名、注释、变量、数组、条件语句与循环等。其中,变量作用域默认为函数或括号内,全局变量则需在函数外显式声明。数组与关联数组则提供了数据存储与访问的灵活性。
在systemtap中,通过探针(probe)来触发事件处理,支持对特定内核函数、模块函数进行探测。此外,systemtap还提供了一系列内置探针(tapset),基于企业im源码开发者可直接调用,加速调试与分析工作。
系统中常见的可探测事件包括函数调用、异常处理、系统调用等,这些事件为开发者提供了丰富的调试切入点。通过精心设计的脚本,开发者能够精准捕捉并分析系统行为,优化性能,定位并解决bug。
systemtap的脚本语言简洁易懂,对于底层开发人员而言,学习曲线相对平缓。然而,掌握其脚本语法与内置探针的使用,对于深入应用systemtap,实现高效、精确的自己jar包源码调试至关重要。
综上所述,systemtap凭借其独特的功能与简洁的语法,为Linux内核调试提供了一种高效、便捷的工具。从入门到掌握,开发者需深入理解其工作原理与脚本语言,灵活应用内置探针,以实现精准的系统调试与优化。
SystemTapå·¥å ·ç使ç¨åºç¡
æ¥çå½åå æ ¸çæ¬æ¯åªä¸ä¸ªï¼ç¶å使ç¨æ¾å°å æ ¸æ建ç详ç»ä¿¡æ¯ï¼ç¶åå»å¯¹åºåå¸ç½ç«ä¸æ¾kernel-debuginfoåkernel-debuginfo-commonå ã
å®æå®è£ åå¯ä»¥éè¿ä¸é¢å½ä»¤æµè¯systemtap
è¿è¡æµè¯ï¼ççsystemtapææ å®è£ æåã
ä¸é¢å½ä»¤æ¼ç¤ºæ¥ç__lookup_hash()å½æ°è¿åæ¶å»å¯ä»¥æ¥çå°çåé
å¨ä¸è¡¨ä¸æ¾ç¤ºäºlookup_hashå¨æ件ä¸çè¡å·ï¼æ¾ç¤ºäºå为$return çåéï¼å ¶å®è¿ä¸ªreturnåéå°±æ¯systemtap表示å½æ°è¿åå¼çãè$name,$base,$flagæ们对çlinuxæºç çåç°è¿æ¯__lookup_hashçä¸ä¸ªå ¥åã
ä¸é¢å½ä»¤å¯ä»¥æ¥ç__lookup_hashå½æ°å ¥å£å¯ä»¥æ¥ççåé
ä¹å¯ä»¥éè¿statementæ¹å¼æ¥çå æ ¸ç¬¦å·è¡¨éæç__lookup_hashç¸å ³çè¡
å¦ææ¥æ¾çå æ ¸å½æ°ä½äºæ个模åéå¯ä»¥ä½¿ç¨ä¸é¢å½ä»¤ï¼
éè¿ä¸é¢å½ä»¤å¯ä»¥æ¥çå°æ个æ£å¨è¿è¡çè¿ç¨çå½æ°
ä¸ä¾ä¸çå°æ¾å°äºsyscall.Mountå½æ°ï¼å¹¶ä¸æå®çææåæ°ååæ°ç±»åé½æå°äºåºæ¥ã
åé¢å¯ä»¥å¨stapèæ¬ä¸ï¼è¿ä¸ªå½æ°çä¸ä¸æéç´æ¥ä½¿ç¨è¿äºåæ°ï¼ä¾å¦éè¿$sourceå¯ä»¥è®¿é®å°åæ°source
systemtapæ¯æprint()åprintf()å½æ°ï¼å ¶ä¸printf使ç¨è¯æ³åcè¯è¨ä¸è´ãæ¯æ%sï¼%dï¼%xæ ¼å¼
å¨systemtapéå¡æ¯ä»¥$å¼å¤´çåéé½æ¯ç®æ åéï¼å¦æç®æ åéç»æä½æéæè ç»æä½å¯¹è±¡ï¼é£ä¹å¯ä»¥ä½¿ç¨->ç´æ¥è®¿é®å ¶æåãä¾å¦ä¸ä¾ä¸ï¼
常è§æ åµä¸ï¼printfï¼ï¼æå°targetåéæ¶å»ï¼åªæå°å ¶å¼ãå¦æéè¦å°å ¶æåï¼æéç±»åçtargetéè¦å°å ¶æåç对象çæåå±å¼ï¼å¯ä»¥å¨targetåéåé¢å $çæ¹å¼ä¾å¦ï¼
ä¸è¬æ åµä¸å¯¹structçå±å¼åªä¼å°æåå¼ä¸çº§ï¼å¦æç¸å¯¹æåå é¨ç»§ç»å±å¼å¯ä»¥å¨ç®æ åéåé¢è·$$
å¨systemtapä¸æ¯æé»è¾ifè¯å¥æ ¼å¼ä¸ºï¼
é»è¾è¯å¥æ¯æ以ä¸æ¯è¾
==ï¼!=,>=,>,<,<=
ä¸è¿°ä¾å对ls -lä¸çxmallocè¿è¡å æ å溯ï¼
-d å¯æ§è¡æ件å
--ldd ææå ±äº«åº
-c âls -lâ æ§è¡çåè¿ç¨ä½
ä¸é¢ä¾åå°æå°__lookup_hashä¸returnè¿ådentry*éinodeæåçi_inoåæå
è¿ä¸ä¾åä¸-o zxy.txtçææå°±æ¯å°ç»æåå ¥æ件zxy.txtä¸ï¼é»è®¤è¾åºå°æ§å¶å°ï¼
ä¸é¢ä¾åå°å¨å æ ¸ä¸ä½¿ç¨å¼ºå¶ç±»å转æ¢
è¿é解éä¸ä¸ï¼å æ ¸ä¸æ¹æ³å¼ºå¶è½¬æ¢
å¨ç¨systemtapè·è¸ªå æ ¸æ¶ä½¿ç¨å æ æå°å½ä»¤ï¼å¸¸å¸¸æå°ä¸åºæ¥å¦å¤æ¨¡åçå½æ°ï¼è¿æ¯å 为è¿äºæ¨¡å没æ被å è½½ãå¯ä»¥å¨systemtapå¯å¨å½ä»¤ä½¿ç¨--all-modules æ¹æ³å¼ºå¶å°ææ模å符å·å 载起æ¥ã
ä¸é¢ä¾å对ç¨golangåçdockerdè¿ç¨syscall.Mountè°ç¨å ¥å£æ¶å»æå°syscall.Mountï¼ï¼å½æ°çåæ°
sourceçstringå段å 容
ä¸é¢ä¾åæå°golangåçdockerdè¿ç¨xxx.Getå½æ°è¿åæ¶å»çåæ°æ åµ
}
systemtap对golangæ¯æä¸å¤å®ç¾ï¼ç¨æ·éè¦èªå·±è§£æåºæ¬ç»æä¾å¦golangçstringï¼arrayåsliceè¿äºé½éè¦ç¨æ·èªå·±è§£æãstring被systemtapè¯å«ä¸ºstruct string,æ¤ç»æsystemtapå¯ä»¥è¯å«çå®ä¹å¯ä»¥ç®å为ï¼
éè¦æ³¨æçæ¯éè¿systemtapæå°golang stringçstring->strä¼å¤æå¾å¤å符ï¼å 为stringæåstr并éæç §cè¯è¨å®ä¹çå符串以\0表示å符串ç»æï¼æ们åªè½ç»åstringçå段lenæ¥è·å精确çå符串å 容
sliceå®å ¨ä¸è¢«systemtapè¯å«ï¼æ们å¯ä»¥å°systemtapå¯ä»¥è¯å«çsliceç®å为æ¤ç§å®ä¹ï¼
å ¶ä¸arrayå°±æ¯æåsliceåå¨åå çé¦å°åã
è¦æ¯æ们æ³è·åhelo=[]string{ âhelloâ,âworldâ}è¿æ ·çå符串sliceçå 容å¯ä»¥éè¿systemtapæä¾ç@cast(addrï¼âtypeâ,âfileâ)å½æ°å°æ个å°å强转为fileä¸å®ä¹çtypeç»æãå ·ä½æ¥è¯´å¯ä»¥å¦ä¸åè·åhelloçå 容
SystemTap GUI特点
SystemTap 是一种用于 Linux 内核诊断的创新工具。它让内核开发人员和系统管理员能够迅速、安全地从运行中的内核中获取信息。无需修改源码、编译内核或重启系统,只需编写或重用简单的脚本,就能收集内核实时数据。
SystemTap 的一个显著特点是其直观的 GUI(图形用户界面)。GUI 提供了一种直观、易用的go redis 源码安装界面,使用户能够轻松执行诊断任务。它简化了数据收集和分析流程,使得即使是经验不足的用户也能快速上手。
另一个特点是可重用的脚本。SystemTap 允许用户创建可重用的脚本来执行特定的诊断任务。这些脚本可以保存并重复使用,从而节省时间并提高效率。此外,社区贡献了许多现成的脚本,用户可以从中选择适合特定需求的脚本。
SystemTap 的另一个优点是其灵活的查询语言。该语言允许用户编写复杂的查询,从内核日志中提取所需信息。这使得 SystemTap 能够处理各种诊断需求,从简单的性能监控到复杂的问题定位。
此外,SystemTap 的安全特性也是其一大亮点。它提供了隔离机制,确保脚本不会对系统造成潜在危害。这意味着用户可以安全地在生产环境中使用 SystemTap,而无需担心对系统稳定性的影响。
总之,SystemTap 的 GUI 特点使其成为一种强大且易于使用的 Linux 内核诊断工具。通过直观的界面、可重用的脚本、灵活的查询语言和安全特性,SystemTap 为内核开发人员和系统管理员提供了一种高效、便捷的方式来收集和分析内核数据。这一工具的出现,无疑为 Linux 内核诊断领域带来了新的活力。
在ESTABLISHED状态时,连接收到SYN会回复什么?
最初的问题,读者在阅读我关于《TCP RST 攻击与如何杀掉一条 TCP 连接》时提出,即处于 ESTABLISHED状态的连接为什么还需要响应 SYN 包?接下来,我们通过实验、内核源码分析与工具介绍,详细解答这一问题。实验复现
在机器 A(IP:...)使用 nc 启动服务监听 端口。同时,机器 B 使用 nc 连接 A 的 nc 服务器,并输入 "hello"。通过 tcpdump 观察此次连接信息。随后,机器 B 使用 scapy 模拟发送 SYN 包,并查看 tcpdump 显示的包结果。实验发现,对于一个序列号为随意的 SYN 包,TCP 回复了正确的 ACK 包,确认号为 。RFC 文档也指出,Linux 内核收到乱序 SYN 报文时,会回复携带正确序列号和确认号的 ACK 包,即 Challenge ACK。原因分析
发送 SYN 包的一端记为 A,接收 SYN 的 ESTABLISHED 状态端记为 B。B 对收到的 SYN 包回复 ACK 的目的是验证先前的连接是否失效,以便采取相应处理。若 A 的连接仍在,则正常处理 ACK 包。若连接已不在,此 SYN 包试图发起新连接,收到 ACK 后,A 会立即回复 RST 包,序列号等于 ACK 包的序列号,B 收到合法的 RST 包后释放连接。若 A 想重新与 B 创建连接,则可再次发送 SYN 包。内核源码分析
使用 SystemTap 工具插入探针,观察内核函数 tcp_send_ack 的调用过程。在端口号为 时,打印函数调用堆栈。通过 SystemTap 脚本执行后,发现 ACK 包经过了 tcp_validate_incoming 和 tcp_send_challenge_ack 函数。RFC 提出了 ACK Throttling 方案,限制每秒最多发送 个 Challenge ACK 报文,通过 sysctl 函数可以调整此限制。RST 攻击
RST 攻击通过伪造 RST 包关闭正常连接。攻击难点在于构造序列号落在对方滑动窗口内的包。实验中,启动 tcpkill 工具并发送 RST 包,观察服务端与客户端进程退出。tcpkill 通过 libpcap 库抓取符合条件的包,从而获取序列号,伪造 IP 发送 RST 包。此外,介绍 killcx 工具,用于处理僵死连接。工具介绍
杀掉 TCP 连接的工具包括 tcpkill 和 killcx。tcpkill 假冒 IP 发送 RST 包,依赖有数据传输的连接才能获取序列号。killcx 是一个 perl 编写的脚本,可以在任何 TCP 连接状态下关闭连接。 总结,本文通过实验、内核源码分析和工具介绍,详细解答了 ESTABLISHED 状态连接为何响应 SYN 包,以及如何使用 Challenge ACK、ACK Throttling、tcpkill 和 killcx 来处理相关连接问题。å¦ä½å¨ Oracle Linux ä¸ä½¿ç¨ PHP DTrace
DTrace æ¯ä¸ä¸ªå欢è¿çãâæ»æ¯å¯ç¨âçè·è¸ªå®ç¨ç¨åºï¼ç¨äºè¯å«å¼ååç产系ç»ä¸çæ§è½åè¡ä¸ºé®é¢ãéç¨äº Oracle Linux çæ åâUEK3âå æ ¸å æ¬äº DTrace æ¯æãéè¿è·è¸ª PHP æ ¸å¿å PHP OCI8 æ©å±ä¸çç¨æ·æ¢æµå¨ï¼æ们å¯ä»¥ææå°è¯å« PHP èæ¬é®é¢ãDTrace 让æ¨å¯ä»¥è·è¸ªç¨æ·åºç¨ç¨åºä¸æä½ç³»ç»ä¹é´ç交äºã
å¨ Oracle Linux ä¸ï¼DTrace å®ç¨ç¨åºéè¦ä¸ä¸ª Oracle Unbreakable Linux Network (ULN) 订é ã
å®è£ Oracle Linux å Oracle Unbreakable Enterprise Kernel çæ¬ 3
é¦å ï¼éè¿ Oracle E-Delivery å®è£ Oracle Linux 6.4ã
å®è£ Oracle Linux 6.4 ä¹åï¼ç¡®ä¿å¨ ULN ä¸å¯ç¨äºâUnbreakable Enterprise Kernel Release 3 for Oracle Linux 6 (x_) - Latestâé¢éãå®è£ UEK3 å æ ¸ï¼
# yum install kernel-uek
å¨ ULN ä¸å¯ç¨âOracle Linux 6 Dtrace Userspace Tools (x_) - Latestâé¢éï¼å®è£ DTrace å®ç¨ç¨åºï¼
# yum install dtrace-utils
éæ°å¼å¯¼å°æ°ç UEK3 3.8. å æ ¸ã
å®è£ PHP
éè¦ä½¿ç¨ --enable-dtrace åæ°æ建 PHPãæ¨å¯ä»¥å®è£ ä¸äºå¯ç¨äº DTrace çé¢å æ建çè¯ä¼°ç RPMï¼è¯·åè§âä½¿ç¨ Oracle Linuxâplaygroundâé¢æ建软件å ç DTrace PHPâã
ä¹å¯ä»¥æç §å¦ä¸æè¿°éæ°æ建 PHPï¼
ä» php.net ä¸è½½ PHP 5.4. æ PHP 5.5.4 ææ´é«çæ¬ï¼ç¶åè¿è¡è§£å缩ï¼
$ tar -xJf php-5.4..tar.bz2
$ cd php-5.4.
é ç½® PHPï¼
$ ./configure \
--prefix=$HOME/p \
--enable-dtrace \
--disable-all --disable-cgi \
--with-pear --enable-xml --enable-libxml --with-zlib
è¿å°æ建ä¸ä¸ªå¯ç¨äº DTrace çæå°çå½ä»¤è¡ PHPãææä¸éè¦çæ©å±å被ç¦ç¨ãæ¨å¯æ ¹æ®éè¦å å«å ¶ä»æ©å±ã
--prefix é项表示å®è£ å°ä¸ä¸ªæ¬å°ç®å½ï¼æ¹ä¾¿æ¨æ¥çå®è£ çæ件ãç¨å®å¿«ç §ä¹åï¼æ¸ ç该ç®å½å¾å®¹æã
pearãxml å zlib é项å è®¸ä½¿ç¨ pecl å½ä»¤ã
çæ PHP äºè¿å¶æ件并è¿è¡å®è£ ï¼
$ make
$ make install
å° php.ini-development å¤å¶å° $HOME/p/lib/php.iniï¼ç¼è¾è¯¥æ件æ¥è®¾ç½®æ¶åºï¼ä¾å¦ï¼
date.timezone = America/Los_Angeles
å®è£ éç¨äº Oracle Database ç PHP OCI8
è¯ä¼°ç PHP RPM å æ¬å¯ä»¥è¿æ¥å° Oracle Database ç OCI8 æ©å±ï¼è¯·åè§åé¢æå°çåæã
ä¸è¿ï¼å¦ææ¨èªå·±ç¼è¯ PHPï¼éè¦æå¨å° PHP OCI8 ä½ä¸ºä¸ä¸ªâå ±äº«çâæ©å±æ·»å ï¼
å¨ ULN ä¸å¯ç¨âOracle Software for Oracle Linux 6 (x_)âé¢éã
以 root ç¨æ·èº«ä»½å®è£ Oracle Instant Clientï¼
# yum install oracle-instantclient.1-basic oracle-instantclient.1-devel
ä½ä¸ºæ®éç¨æ·ï¼è®¾ç½® PHP ç PATHï¼
$ export PATH=$HOME/p/bin:$PATH
å¦æéè¦è®¿é® :/
设置ç¨æ¥å¯ç¨ DTrace çç¯å¢åé PHP_DTRACEï¼ç¶åå®è£ PHP OCI8ï¼
$ PHP_DTRACE=yes pecl install oci8-2.0.2
æ¬æåé¢å°è¦ç¨å°ç DTrace æ¢æµå¨å®ä¹åºäº PHP OCI8 2.0.2ï¼å æ¤éè¦å®è£ æç¡®ççæ¬ãå¦ææ¨è¦å®è£ æ´é«ççæ¬ï¼è¯·æ¥çæ¢æµå¨åå ¶åæ°ï¼äºè§£ææ°çæ¬ä¸çå°æ¹è¿ã
å½æ示 ORACLE_HOME ç®å½æ¶ï¼æ éè¾å ¥ææ¬ï¼ç´æ¥æ Returnãå®è£ å°èªå¨æ£æµ Oracle Instant Client RPMãé ç½®å°ç»§ç»ï¼è¾åºå°å å«ç±»ä¼¼ä¸é¢çå 容ï¼
[ . . . ]
checking for Oracle Database OCI8 support... yes, shared
checking PHP version... 5.4., ok
checking OCI8 DTrace support... yes
[ . . . ]
configure: WARNING: OCI8 extension: ORACLE_HOME is not set,
looking for default Oracle Instant Client instead
checking Oracle Instant Client directory...
/usr/lib/oracle/.1/client/lib
checking Oracle Instant Client SDK header directory...
/usr/include/oracle/.1/client
checking Oracle Instant Client library version compatibility... .1
[ . . . ]
å次ç¼è¾ php.iniï¼æ·»å PHP OCI8ï¼
extension=oci8.so
确认å®è£ ï¼
$ php --ri oci8
oci8
OCI8 Support => enabled
OCI8 DTrace Support => enabled
OCI8 Version => 2.0.2-dev
Revision => $Id: bfb4befd9f5ce8abfea0cffef $
Oracle Run-time Client Library Version => .1.0.1.0
Oracle Compile-time Instant Client Version => .1
Directive => Local Value => Master Value
oci8.max_persistent => -1 => -1
oci8.persistent_timeout => -1 => -1
oci8.ping_interval => =>
oci8.privileged_connect => Off => Off
oci8.statement_cache_size => =>
oci8.default_prefetch => =>
oci8.old_oci_close_semantics => Off => Off
oci8.connection_class => no value => no value
oci8.events => Off => Off
Statistics =>
Active Persistent Connections => 0
Active Connections => 0
PHP OCI8 å®è£ 说æ
为äºæ¯æ DTraceï¼éè¦ä» PECL å®è£ PHP OCI8 2.0ï¼å 为 PHP 5.4 å PHP 5.5 å å«ç PHP OCI8 1.4 没æ DTrace æ¢æµå¨ãå°æ¥ï¼å¨ PHP 5.6 åå¸åï¼æ¨å°±è½å¤å¨æ建 PHP æ¶é ç½®æ¯æ DTrace ç PHP OCI8ã
å½ç¶ï¼æ¨å¯ä»¥éè¿ Oracle Instant Client zip æ件å®è£ PHP OCI8ï¼ä¹å¯ä»¥ä» 使ç¨ç°æç ORACLE_HOME å®è£ ã
æ¨å¯ä»¥å¨ä¸å å«ææªé ç½® DTrace ç PHP çæ¬ä¸å®è£ å¯ç¨ DTrace ç PHP OCI8ãè¿å æ¬ PHP æ©æçæ¬ãæ¨å°è½å¤è·è¸ª PHP OCI8 æ¢æµå¨ï¼ä½æ æ³è·è¸ªæ ¸å¿ PHP æ¢æµå¨ã类似å°ï¼æ¨å¯ä»¥å¨å¯ç¨ DTrace ç PHP ä¸å®è£ ç¦ç¨ DTrace ç PHP OCI8ã
å¦ææ¨ä½¿ç¨ phpize å configureï¼èä¸æ¯ peclï¼ä» PECL å®è£ PHP OCI8 2.0 ï¼åä»é设置 PHP_DTRACE=yesãè¿æ¯å 为 PECL 软件å æéç configure èæ¬å°å¿½ç¥ --enable-dtrace é项ã
PHP OCI8 2.0 é ç½®èæ¬éåâçæ£çâDTrace 使ç¨ï¼ä½ Linux SystemTap ä¸ä¼è·è¸ªæ©å±ã
注æï¼DTrace ä¼ååçäºè¿å¶æ件产ççè¾åºå¯è½ä¸æ们æè§å°ç代ç ä¸å°½ç¸åã
éªè¯ PHP DTrace æ¢æµå¨
以 root ç¨æ·èº«ä»½å¯ç¨ DTraceï¼å 许æ®éç¨æ·è®°å½è·è¸ªä¿¡æ¯ï¼
# modprobe fasttrap
# chmod /dev/dtrace/helper
æ¨å¯ä»¥ä½¿ç¨ ACL 软件å è§åéå¶ç¹å®ç¨æ·å¯¹è®¾å¤ç访é®ï¼èéä½¿ç¨ chmod å½ä»¤ã
ä½ä¸ºæ®éç¨æ·è¿è¡ phpï¼ä¸å¸¦ä»»ä½é项ãPHP å°å¯å¨ï¼ç¶åçå¾ è¾å ¥ï¼
$ php
以 root ç¨æ·èº«ä»½ååºå¯ç¨ç DTrace æ¢æµå¨ãååºäº PHP æ ¸å¿æ¢æµå¨å PHP OCI8 æ¢æµå¨ï¼
# dtrace -l -m php -m oci8.so
4 php php dtrace_compile_file compile-file-entry
5 php php dtrace_compile_file compile-file-return
6 php php zend_error error
7 php php ZEND_CATCH_SPEC_CONST_CV_HANDLER exception-caught
8 php php zend_throw_exception_internal exception-thrown
9 php php dtrace_execute_ex execute-entry
php php dtrace_execute_internal execute-entry
php php dtrace_execute_ex execute-return
php php dtrace_execute_internal execute-return
php php dtrace_execute_ex function-entry
php php dtrace_execute_ex function-return
php php php_request_shutdown request-shutdown
php php php_request_startup request-startup
php oci8.so php_oci_dtrace_check_connection oci8-check-connection
php oci8.so php_oci_do_connect oci8-connect-entry
php oci8.so php_oci_persistent_helper oci8-connect-expiry
php oci8.so php_oci_do_connect_ex oci8-connect-lookup
php oci8.so php_oci_pconnection_list_np_dtor oci8-connect-p-dtor-close
php oci8.so php_oci_pconnection_list_np_dtor oci8-connect-p-dtor-release
php oci8.so php_oci_do_connect oci8-connect-return
php oci8.so php_oci_do_connect_ex oci8-connect-type
php oci8.so php_oci_error oci8-error
php oci8.so php_oci_statement_execute oci8-execute-mode
php oci8.so php_oci_create_spool oci8-sesspool-create
php oci8.so php_oci_create_session oci8-sesspool-stats
php oci8.so php_oci_create_session oci8-sesspool-type
php oci8.so php_oci_statement_create oci8-sqltext
PHP æåä¸è¯¦ç»è®°è½½äºæ ¸å¿ PHP æ¢æµå¨ãPHP OCI8 æ¢æµå¨å¦ä¸æè¿°ã
å¨ç¨æ·ç»ç«¯ï¼ç¨ Ctrl-C åæ¢ php å¯æ§è¡æ件ã
$ php
^C
$
PHP OCI8 2.0 DTrace æ¢æµå¨æ¦è¿°
éæ PHP OCI8 2.0 æ¢æµå¨å¯å为âç¨æ·âæ¢æµå¨åâç»´æ¤è âæ¢æµå¨ãåè å¯¹äº PHP OCI8 ç»´æ¤è æ´æç¨ï¼å¯å¨æ©å±å¼åæé´éªè¯åè½ãæææ¢æµå¨å以åæ°å½¢å¼è¿åæ°æ®ãå®æ¹ææ¡£ä¸è¯¦ç»ä»ç»äº PHP OCI8 DTrace æ¢æµå¨ã
å¨ OCI8 2.0.2 ä¸ï¼ç¨æ·æ¢æµå¨å æ¬ï¼
oci8-connect-entry â ç± oci_connect()ãoci_pconnect() å oci_new_connect() å¯å¨ãå¨å»ºç«æ°æ®åºè¿æ¥ä¹å触åã
char *username â è¿æ¥ç¨æ·åã
char *dbname â æ°æ®åºè¿æ¥å符串ã
char *charset â æå®çå符éã
long session_mode â OCI_SYSDBA (0x2)ãOCI_SYSOPER (0x4) å OCI_CRED_EXT (1<<) çäºè¿å¶âæâï¼æè è¿å»ææ使ç¨å¹³å°ä¸ç -ï¼ãé»è®¤æ åµä¸ï¼è®¾ç½®ä¸º 0ã
int persistent â å¦æè°ç¨äº oci_pconnect()ï¼å设置为 1ï¼å¦å设置为 0ã
int exclusive â å¦æè°ç¨äº oci_new_connect()ï¼å设置为 1ï¼å¦å设置为 0ã
oci8-connect-return â å¨è¿æ¥çæ«å°¾è§¦åã
void *connection â è¿æ¥ç»æçå°åã
oci8-check-connection â å¦æ Oracle é误å¯è½å·²ç»å¯¼è´è¿æ¥å¤±æï¼åå¯å¨ã
void *connection â è¿æ¥ç»æçå°åã
int is_open â å¦æ errcode æ server_status æ示è¿æ¥æ æä¸å¿ é¡»éæ°å建ï¼å为 0ã
long errcode â Oracle é误ç¼å·ã
unsigned long server_status â 为 Oracle åºçä¸ä¸ªæ示å¨ï¼æ示è¿æ¥æ¯å¦æ æãå¦æå 为 errcode æ示è¿æ¥æ æå¯¼è´ is_open 为 0ï¼å server_status ä¸ºå ¶é»è®¤å¼ 1ã
oci8-sqltext â æ§è¡ oci_parse() æ¶å¯å¨ã
void *connection â è¿æ¥ç»æçå°åã
char *sql â ææ§è¡ç SQL è¯å¥çææ¬ã
oci8-error â å¦æåç Oracle é误ï¼åå¯å¨ã
int status â Oracle è¿å失败ç Oracle åºè°ç¨çç¶æï¼å¦ -1 代表 Oracle ç OCI_ERRORï¼1 代表 Oracle ç OCI_SUCCESS_WITH_INFOã请åè§ Oracle ç oci.hï¼äºè§£ææå®ä¹ã
long errcode â Oracle é误ç¼å·ã
oci8-execute-mode â æ示 oci_execute() è°ç¨çæ交ç¶æã
void *connection â è¿æ¥ç»æçå°åã
unsigned int mode â ä¼ éç» Oracle åºç模å¼ï¼å¦ OCI_NO_AUTO_COMMIT (0x)ãOCI_DESCRIBE_ONLY (0x) æ OCI_COMMIT_ON_SUCCESS (0x)ã
注ï¼ææ°ç OCI8 2.0.6 ä¸å å« oci8-connection-close æ¢æµå¨ï¼æå 个æ¢æµå¨ç°å¨ä¹å ·æ client_id åæ°åæåè¯å¥ç»æçæéã
ç»´æ¤è æ¢æµå¨å¦ä¸æ示ãåæ°æ述请åè PHP OCI8 æºä»£ç ã
oci8-connect-p-dtor-close
void *connection
oci8-connect-p-dtor-release
void *connection
oci8-connect-lookup
void *connection
int is_stub
oci8-connect-expiry
void *connection
int is_stub
long idle_expiry
long timestamp
oci8-connect-type
int persistent
int exclusive
void *connection
long num_persistent
long num_connections
oci8-sesspool-create
void *session_pool
oci8-sesspool-stats
unsigned long free
unsigned long busy
unsigned long open
oci8-sesspool-type
int type
void *session_pool
PHP OCI8 2.0 ä¸çæ¢æµå¨ä»£æ¿äº PHP OCI8 1.4 ä¸ä½¿ç¨ç oci_internal_debug() è·è¸ªã该å½æ°å·²åæä¸æ¡ç©ºæ令ï¼ä¸æ§è¡ä»»ä½æä½ã
ä½¿ç¨ PHP OCI8 å DTrace
æ§è¡ä»¥ä¸æ¥éª¤ã
å建ä¸ä¸ªç®åç PHP æ件 oci8.php æ¥æ¥è¯¢æ°æ®åºï¼
<?php
error_reporting(0);
ini_set('display_errors', 'Off');
function do_query($c, $sql)
{
$s = oci_parse($c, $sql);
if (!$s)
return;
$r = oci_execute($s);
if (!$r)
return;
while (($row = oci_fetch_row($s)) != false) {
foreach ($row as $item) {
echo $item . " ";
}
echo "\n";
}
}
$c = oci_new_connect('hr', 'welcome', 'localhost/pdborcl');
do_query($c, "select city from locations where rownum < 5 order by 1");
do_query($c, "select something from does_not_exist");
?>
å建ä¸ä¸ª D èæ¬ user_oci8.d æ¥æ¢æµ oci8.php çæ§è¡ï¼
#!/usr/sbin/dtrace -Zs
# This script is for OCI8 2.0.2
php*:::oci8-connect-entry
{
printf("PHP connect-entry\n");
printf("\t username %s\n", arg0 ? copyinstr(arg0) : "");
printf("\t dbname %s\n", arg1 ? copyinstr(arg1) : "");
printf("\t charset %s\n", arg2 ? copyinstr(arg2) : "");
printf("\t session_mode %ld\n", (long)arg3);
printf("\t persistent %d\n", (int)arg4);
printf("\t exclusive %d\n", (int)arg5);
}
php*:::oci8-connect-return
{
printf("PHP oci8-connect-return\n");
printf("\t connection 0x%p\n", (void *)arg0);
}
php*:::oci8-connection-close
{
printf("PHP oci8-connect-close\n");
printf("\t connection 0x%p\n", (void *)arg0);
}
php*:::oci8-error
{
printf("PHP oci8-error\n");
printf("\t status %d\n", (int)arg0);
printf("\t errcode %ld\n", (long)arg1);
}
php*:::oci8-check-connection
{
printf("PHP oci8-check-connection\n");
printf("\t connection 0x%p\n", (void *)arg0);
printf("\t is_open %d\n", arg1);
printf("\t errcode %ld\n", (long)arg2);
printf("\t server_status %lu\n", (unsigned long)arg3);
}
php*:::oci8-sqltext
{
printf("PHP oci8-sqltext\n");
printf("\t connection 0x%p\n", (void *)arg0);
printf("\t sql %s\n", arg0 ? copyinstr(arg1) : "");
}
php*:::oci8-execute-mode
{
printf("PHP oci8-execute-mode\n");
printf("\t connection 0x%p\n", (void *)arg0);
printf("\t mode 0x%x\n", arg1);
}
ä½¿ç¨ OCI8 2.0.6ï¼ä¸äºåæ°çæ°å¼éè¦è°æ´ï¼æè½æ»¡è¶³ç°å¨ä¸äºæ°å¢åæ°çéè¦ã
以 root ç¨æ·èº«ä»½å¯å¨ D èæ¬ã该èæ¬å°æåï¼çå¾ æ¢æµå¨è§¦åï¼
# chmod +x user_oci8.d
# ./user_oci8.d
ï¼ç¨åï¼ä½éªå® PHP ä¹åï¼å¯ä»¥ä½¿ç¨ Ctrl-C å ³éæ¤ç»ç«¯ãï¼
å¨å¦ä¸ä¸ªçªå£ä¸è¿è¡å½ä»¤è¡ PHPãæ¾ç¤ºæåæ¥è¯¢çè¾å ¥ï¼
$ php oci8.php
Beijing
Bern
Bombay
Geneva
å¨è¿è¡ D èæ¬ç root ç»ç«¯ï¼å°æ¾ç¤º PHP æ§è¡æé´è§¦åçæ¢æµå¨ï¼
# ./user_oci8.d
dtrace: script 'user_oci8.d' matched 0 probes
CPU ID FUNCTION:NAME
1 php_oci_do_connect:oci8-connect-entry PHP connect-entry
username hr
dbname localhost/pdborcl
charset
session_mode 0
persistent 0
exclusive 0
0 php_oci_do_connect:oci8-connect-return PHP oci8-connect-return
connection 0x7fecff0
0 php_oci_statement_create:oci8-sqltext PHP oci8-sqltext
connection 0x7fecff0
sql select city from locations where rownum < 5 order by 1
0 php_oci_statement_execute:oci8-execute-mode PHP oci8-execute-mode
connection 0x7fecff0
mode 0x
0 php_oci_statement_create:oci8-sqltext PHP oci8-sqltext
connection 0x7fecff0
sql select something from does_not_exist
0 php_oci_statement_execute:oci8-execute-mode PHP oci8-execute-mode
connection 0x7fecff0
mode 0x
0 php_oci_error:oci8-error PHP oci8-error
status -1
errcode
0 php_oci_dtrace_check_connection:oci8-check-connection PHP oci8-check-connection
connection 0x7fecff0
is_open 1
errcode
server_status 1
0 php_oci_connection_close:oci8-connection-close PHP oci8-connect-close
connection 0x7fecff0
ï¼å° -q æ·»å å° user_oci8.d ç /usr/sbin/dtrace åæ°å°éè CPU å ID 详ç»ä¿¡æ¯ãï¼
å¨å¤ CPU 计ç®æºä¸ï¼æ¢æµå¨å¯è½ä¸ä¼é¡ºåºåºç°ï¼å ·ä½åå³äºåªä¸ª CPU æ£å¨å¤çæ¢æµå¨ãæ¾ç¤ºæ¢æµå¨æ¶é´æ³å°æå©äºæ¶é¤æ··æ·ï¼ä¾å¦ï¼
php*:::oci8-connect-entry
{
printf("PHP connect-entry at %lld\n", walltimestamp);
}
ä» user_oci8.d DTrace è¾åºä¸ï¼æ¨å¯ä»¥çå°ä»¥ä¸å 容ï¼
åèµ·çè¿æ¥ (oci8-connect-entry)ãè¿æ¥å° localhost/pdborcl æ°æ®åºçç¨æ· hrãå 为 exclusive å persistent å为 0ï¼æ以æ¯ä¸ä¸ª oci_connect() è°ç¨ãæªè¯·æ±ä»»ä½æ¾å¼çå符éã请æ±çæ¯é»è®¤çä¼è¯æ¨¡å¼ï¼oci_connect ç第äºä¸ªå¯éåæ°)ã
å¯¹ä¸¤æ¡ SQL è¯å¥è¿è¡åæ (oci8-sqltext)ï¼å¹¶ä»¥ 0xï¼å³ OCI_COMMIT_ON_SUCCESSï¼æ¨¡å¼æ§è¡ (oci-execute-mode)ã
çæäº (oci8-error) ä¸æ¡ Oracle é误 â ORA-ï¼è¡¨æè§å¾ä¸åå¨ï¼ã
该é误导è´è¦éªè¯è¿æ¥ç¶æ (oci8-check-connection)ãis_open çå¼ä¸º 1ï¼è¡¨ç¤ºè¿æ¥æ£å¸¸ã
éè¿è¿äºä¿¡æ¯ï¼æ¨å¯ä»¥è·è¸ªæé®é¢çè¯å¥æ§è¡åè¿æ¥é®é¢ã
æ»ç»
DTrace æ¯ä¸ä¸ªé常强大çå®ç¨ç¨åºï¼æ¬æåªæ¯æå ³å ¶ç¨æ³çåªè¨çè¯ãéè¿ä¸è¿°ç¤ºä¾ï¼å¯å° PHP OCI8 è·è¸ªä¸æ ¸å¿ PHP è·è¸ªç¸éæãæ¨å¯ä»¥è®¾ç½® PHP å½æ°è°ç¨çæ¶é´ï¼è®¡ç®è°ç¨ç次æ°ãæ¨å¯ä»¥æ·±å ¥äºè§£ PHP è¿è¡çæä½ç³»ç»è°ç¨ãBryan Cantrill å¨ DTrace å PHPï¼æ¼ç¤ºï¼ä¸åå¸äºä¸äºæ ¸å¿ PHP è·è¸ªç示ä¾ãï¼æ³¨æï¼å客平å°å级导è´å ¶åæä¸çä¸ä¸ªåææ æ¾ç¤ºä¸ºä¸¤ä¸ªåææ ãèä¸ï¼æ¨ä¸åéè¦åç¬ç PHP DTrace æ©å±ãï¼Brendan Gregg ç DTrace Toolkit å å«è®¸å¤æç¨ç DTrace èæ¬ãè¿æåç§ä¸åçå客ã
è®°ä½ï¼DTrace çç®çæ¯å§ç»å¯ç¨å ¶åè½ï¼éåå¼ååç产ï¼æ¤è¿ç¨æéè¦ DTraceï¼ãDTrace ç设计æå³çæ¢æµå¨ä¸åçè§æ¶é¶å¼éã