扩展开发之大坑小坑都是坑- 调用其他扩展函数
写扩展遇到的一个坑,在PHP扩展中调用其他扩展的函数
在扩展方法中调用了 string.c 里面的函数 php_string_tolower
简化代码如下:
zend_string *where, *lower_where ; zval call_func_name, call_func_ret, call_func_params[2], *entry; if (zend_parse_parameters(ZEND_NUM_ARGS(), "S", &where) == FAILURE) { RETURN_FALSE; } lower_where = php_string_tolower(where); printf("%s \r\n", ZSTR_VAL(lower_where));
执行编译这段代码,返回错误提示
[root@localhost php]# /usr/local/php7.1.11/bin/php test.php Segmentation fault
使用 gdb 调试,当执行到 php_string_tolower(where) 时可以成功打印出转小写的字符串
但是打印 lower_where 打印不出结果,提示信息如下:
(gdb) p *lower_where value has been optimized out
一开始以为 php_string_tolower() 函数返回类型与定义的接收参数类型不同,更换成 zval,
也更换了返回值赋值方式,使用 ZVAL_STR() 宏都没办法成功赋值
最后!最后! 最后! 最后!……
在不懈的尝试后 引入 php_string.h 头文件
#include "ext/standard/php_string.h"
对的,你没有看错,因为没有引入头文件导致的错误
但是 gdb 调试的时候可以打印出结果
好吧,一次坑的记录到此为止