- 作者: Laruence( )
- 本文地址: http://www.laruence.com/2011/12/06/2381.html
- 转载请注明出处
以前, 我曾经介绍过如何通过PHP的Core文件获取信息:如何调试PHP的Core之获取基本信息, 对于调用参数这块, 当时介绍的获取方法比较复杂.
于是今天我为PHP 5.4的.gdbinit做了一个改进, 以后如果你遇到了PHP 5.4的core, 那么就可以简单的得到PHP 5.4发生Core时, 包括参数的函数调用栈的信息.
假设对于如下的脚本:
<?php class Test { } function a($i) { b(new Test, 2.3432, "reader"); } function b($i) { c(array(1,2,3)); } function c($i) { d(TRUE); } function d($i) { $fp = fopen("/tmp/1.php", "r"); e($fp); } function e($i) { sleep(1000); } a();
使用后台运行以后, PHP5.4会sleep在e函数的sleep中, 这时, 如果我们使用gdb attach上去,
gdb --pid= xxx //使用ps获得后台运行脚本的pid
然后, source PHP源代码下面的.gdbinit:
(gdb) source php54-src/.gdbinit
然后, 让我们尝试调用下zbacktrace, 看看什么结果:
(gdb) zbacktrace [0x2a95dac5e0] sleep(1000) /tmp/1.php:21 [0x2a95dac4c0] e(resource(#5)) /tmp/1.php:17 [0x2a95dac3f0] d(true) /tmp/1.php:13 [0x2a95dac300] c(array(3)[0x2a95de7db0]) /tmp/1.php:10 [0x2a95dac1c0] b(object[0x2a95de7840], 2.343200, "reader") /tmp/1.php:7 [0x2a95dac0e8] a() /tmp/1.php:24
恩, 对于array和object, 因为我们为了保持不要乱屏, 所以没有展开, 不过, 如果我们要查看这个array具体是什么元素, 可以这样做, 注意到上面的:array(3)[0x2a95de7db0]:
(gdb) print ((zval *)0x2a95de7db0) $4 = (struct _zval_struct *) 0x2a95de7db0 (gdb) printzv $4 [0x2a95de7db0] (refcount=2) array(3): { 0 => [0x2a95de79d0] (refcount=1) long: 1 1 => [0x2a95de7b80] (refcount=1) long: 2 2 => [0x2a95de7c98] (refcount=1) long: 3 }
类似的, 对于object, 注意到上面的: object[0x2a95de7840]
(gdb) print ((zval *)0x2a95de7840) $5 = (struct _zval_struct *) 0x2a95de7840 (gdb) printzv $5 [0x2a95de7840] (refcount=2) object (Test) #1"no properties found"
要注意的一点是, 对于object, 如果你是在调式Core文件, 而不是attach到一个运行的进程上, 那么上面的尝试会得到一个错误:
(gdb) printzv $5 [0x2a95de7840] (refcount=2) objectYou can't do that without a process to debug.
不过, 即使这样, 我们还是有办法, 只不过就比较麻烦了.在NTS下面:
(gdb) p ((zval *)0x2a95de7840)->value.obj.handle $6 = 1 //注意, 下面用到了这个$6的值:1 (gdb) p (zend_object*) executor_globals->objects_store.object_buckets[1].bucket.obj.object $7 = (struct _zend_object *) 0x2a95de3ec0 (gdb) p $9->ce->name $8 = 0x2a95e200b0 "Test"
呵呵, 怎么样, 有了这些信息, 分析Core的原因, 是不是就更简单了呢? enjoy~
最后, 还是要提醒下: PHP 5.4还处于开发阶段, 在最终release之前, 任何新特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好.
谢谢
更多更新信息, 请关注: Changelog
Comments
- 2011/12/06, 66beta writes: 完全看不懂,但是感觉很厉害的样子
- 2011/12/06, 巫山霏云 writes: 依然还是蛮麻烦的,不过确实要方便一些
不过要PHP CORE还真蛮难的 - 2011/12/06, treesky writes: 完全看不懂,但是感觉很厉害的样。Php,我才刚上路啊!
- 2011/12/06, CFC4N writes: 比起上一篇提到的isset的消息,这是个天大的好事情,调试代码性能简直方便多了,很容易找到执行最耗时的瓶颈所在。感谢PHP开发组。感谢鸟哥,感谢郭嘉。
PS:唠叨一遍,这是个好功能。 - 2011/12/07, xq262144 writes: 嗯,这个要好用多了,有参数的各种信息,不过我还是纠结于看HashTable的东西要人工计算hash。。。:-)
- 2011/12/08, chenchaogang writes: 打印那个object还是很不方便啊
- 2011/12/10, Iterse’s blog writes: c的源码看不明白…
- 2011/12/15, Nathan writes: 能否写一篇详解apc参数的文章?官方的太简略了,部分参数完全不知道是干什么用的
- 2011/12/18, pytonic writes: 可否给5.2.* 5.3.*加上此功能?
要用上5.4还要很久呢
Related posts:
- AllowEncodedSlashes in Apache
- 实现PHP的编译执行分离(separating compilation and execution)
- Zend Signal in PHP 5.4
- 使用gettext来支持PHP的多语言
- 如何调试PHP的Core之获取基本信息
Copyright © 2010 风雪之隅 版权所有, 转载务必注明. 该Feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发E-mail至my at laruence.com.(Digital Fingerprint: 73540ba0a1738d7d07d4b6038d5615e2)
Related Posts:
转载请注明:爱开源 » 更简单的重现PHP Core的调用栈