来自:http://www.codefrom.com/paper/%E4%BD%BF%E7%94%A8gdb%E8%B0%83%E8%AF%95p...php
php的扩展使用c/c++开发,能够很容易的使用gdb进行调试。具体步骤以下:
首先编译php的时候须要加上** --enable-debug**参数c++
./configure --enable-debug make && make install
在个人ubuntu机器上面测试,扩展的目录默认为 /usr/local/lib/php/extensions/debug-non-zts-20131226/
这样进行php的源码调试也很方便。
下一步进行扩展建立,进入php源码的ext目录,运行ubuntu
./ext_skel --extname=mydebug
当前目录下会自动生成mydebug目录,而后进入该目录,编辑config.m4文件,去掉10~12行的dnl,以下函数
PHP_ARG_WITH(mydebug, for mydebug support, Make sure that the comment is aligned: [ --with-mydebug Include mydebug support])
在最后一行添加测试
if test -z "$PHP_DEBUG"; then AC_ARG_ENABLE(debug, [--enable-debg compile with debugging system], [PHP_DEBUG=$enableval], [PHP_DEBUG=no] ) fi
这样就表示该扩展可以进行调试了,而后编译该扩展,使用命令this
phpize ./configure --enable-debug make && make install
这里的 phpize
和 php-config
须要事先配置好环境变量,而后加载该扩展。在个人机器上面地址为 /usr/local/lib/php/extensions/debug-non-zts-20131226/
。进入mydebug扩展源码目录,默认生成的函数为 confirm_mydebug_compiled
,定义在 mydebug.c
,扩展自动生成的函数。debug
PHP_FUNCTION(confirm_mydebug_compiled) { char *arg = NULL; int arg_len, len; char *strg; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "mydebug", arg); RETURN_STRINGL(strg, len, 0); }
大概意思就是获取字符串参数,而后拼成一句字符串返回。经过nm命令查看生成的mydebug.so导出的符号。调试
运行 nm mydebug.so 返回 zif_confirm_mydebug_compiled ……
PHP_FUNCTION
实际就是在函数名前面添加 zif_
,而后进行gdb调试code
第一步运行: gdb php 而后运行: break zif_confirm_mydebug_compiled 终端提示:Function "zif_confirm_mydebug_compiled" not defined. Make breakpoint pending on future shared library load? (y or [n]) 输入: y 输入: run /tmp/test.php 此时会回显:Breakpoint 1, zif_confirm_mydebug_compiled (ht=1, return_value=0xb7bf0d44, return_value_ptr=0xb7bd6104, this_ptr=0x0, return_value_used=1) at /...../php-5.6.6/ext/mydebug/mydebug.c:56 而后输入: l 显示: 54 PHP_FUNCTION(confirm_mydebug_compiled) 55 { 56 char *arg = NULL; 57 int arg_len, len; 58 char *strg; 59 60 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
其中文件/tmp/test.php的内容为:开发
<?php echo confirm_mydebug_compiled("hello world");
能够看到,函数源代码已经出来了,能够使用经常使用的gdb命令进行调试了。
更多精彩原创内容进入http://www.codefrom.com/