重现PHP Core的调用栈
以前, 我曾经介绍过如何通过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) {
- ,,));
- }
- function c($i) {
- d(TRUE);
- }
- function d($i) {
- $fp = fopen("/tmp/1.php", "r");
- e($fp);
- }
- function e($i) {
- );
- }
- a();
使用后台运行以后, PHP5.4会sleep在e函数的sleep中, 这时, 如果我们使用gdb attach上去,
- gdb --pid= xxx //使用ps获得后台运行脚本的pid
然后, source PHP源代码下面的.gdbinit:
- (gdb) source php54-src/.gdbini
然后, 让我们尝试调用下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:2
恩, 对于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变得更好
重现PHP Core的调用栈的更多相关文章
- Linux下手动获取当前调用栈
被问到如何手动获取当前的调用栈,之前碰到过一时没记起来,现在回头整理一下. 其原理是:使用backtrace()从栈中获取当前调用各层函数调用的返回地址,backtrace_symbols()将对应地 ...
- arm平台的调用栈回溯(backtrace)
title: arm平台的调用栈回溯(backtrace) date: 2018-09-19 16:07:47 tags: --- 介绍 arm平台的调用栈与x86平台的调用栈大致相同,稍微有些区别, ...
- 获取崩溃时的调用栈和生成dump文件,然后自动重启
首先要说明的是: linux 下 比较方便可以得到 崩溃时的调用栈,win下 比较难办 1. linux 获取调用栈 代码奉上: #include <execinfo.h> //在头 ...
- JavaScript是如何工作的:引擎,运行时间以及调用栈的概述
JavaScript是如何工作的:引擎,运行时以及调用栈的概述 原文:How JavaScript works: an overview of the engine, the runtime, and ...
- 在c或c+程序里打印调用栈。转
在C/C++程序里打印调用栈信息 我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如 ...
- 在C/C++程序里打印调用栈信息
我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如果能让程序自己输出调用栈,那是最好 ...
- android打印调用栈
在某些机器上,不能下断点,出现了某个诡异的问题,想到唯一的解决方式,就是打印调用栈了,google发现这个,记录下,以后备用 Log.d(",Log.getStackTraceString( ...
- Nagios Core/Icinga 基于栈的缓冲区溢出漏洞
漏洞名称: Nagios Core/Icinga 基于栈的缓冲区溢出漏洞 CNNVD编号: CNNVD-201402-484 发布时间: 2014-03-03 更新时间: 2014-03-03 危害等 ...
- GDB 运行PYTHON 脚本+python 转换GDB调用栈到流程图
http://tromey.com/blog/?cat=17 http://blog.csdn.net/cnsword/article/details/16337031 http://blog.csd ...
随机推荐
- Linux sysfs device_attribute
/*************************************************************************** * Linux sysfs device_at ...
- 多线程程序设计学习(13)Active Object pattern
Active Object[接收异步消息的对象] 一:Active Object的参与者--->客户端线程(发起某种操作请求处理)--->代理角色(工头)--->实际执行者(工人)- ...
- [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.5.10
Every $k\times k$ positive matrix $A=(a_{ij})$ can be realised as a Gram matrix, i.e., vectors $x_j$ ...
- linux下socket keep alive讲解
[需求] 不影响服务器处理的前提下,检测客户端程序是否被强制终了.[现状]服务器端和客户端的Socket都设定了keepalive属性.服务器端设定了探测次数等参数,客户端.服务器只是打开了keepa ...
- 序列化框架性能对比(kryo、hessian、java、protostuff)
简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Protostuff 速度快,基于protobuf 需静态编译 Protostuff- ...
- win7(64位)+IE8+QC9.0
环境win7(64位)+IE8+QC9.0出现的问题IE8访问QC9.0有时访问登录显示正常,但是有时访问QC页面无法显示正常,然后在ie8中安全中设置“启用内存保护帮助减少联机攻击*”也无法找到该项 ...
- 位图9宫格 BitmapSlice9.jsfl
/** * Version 1.1, May 4: fixed issue with symbols in library folders. **/ /** * BitmapSlice9 JSFL b ...
- Base-Android快速开发框架(五)--网络操作之RequestModel、ResponeModel、CustomAsyncHttpClient
在正式介绍CustomAsyncHttpClient之前,刚好最近有一个朋友找我帮忙给他们看下一个APP.我先上一段代码截图.一段检测版本更新的接口代码.
- r语言入门资料
最近有好多r语言的爱好者问我r语言的事情,在百度上简单的收一收,感觉都在扯淡,真正适合初学者入门的资料几乎没有,比如最开始用什么编辑器比较好,在哪下载,最开始学习的例子有什么? 在日本网站上反倒是找 ...
- linux tar打包
范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩![root ...