扩展开发之大坑小坑都是坑- 调用其他扩展函数

扩展开发之大坑小坑都是坑- 调用其他扩展函数

写扩展遇到的一个坑,在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 调试的时候可以打印出结果
好吧,一次坑的记录到此为止

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注