运行 zend_hash_find() 时出现分段错误

Posted

技术标签:

【中文标题】运行 zend_hash_find() 时出现分段错误【英文标题】:Segmentation fault while running zend_hash_find() 【发布时间】:2012-03-06 20:37:23 【问题描述】:

我编写了一个简单的 php 模块并尝试运行 zend_hash_find() 函数。但我收到一条奇怪的段错误消息。 在 Centos 6.2 64bit(VM 下)、php 5.4.0 上运行(也发生在 5.3.3 上)

函数如下:

void my_func(const char *fname,int fname_len TSRMLS_DC)
void *func;
char *funcname = estrndup( fname , fname_len ) ;

php_printf("Before find\n");

if (zend_hash_find(EG(function_table), funcname,  fname_len + 1, (void **) &func) == FAILURE)
    php_printf("not found");

php_printf("after find \n");
efree(funcname);

这就是函数的调用方式

my_func("fopen",5 TSRMLS_CC);

我看到“Before find”消息,然后是 coredump。这是gdb消息

Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from /usr/lib64/php/modules/mymod.so...done.
Loaded symbols for /usr/lib64/php/modules/mymod.so
Core was generated by `php test.php'.
Program terminated with signal 11, Segmentation fault.
#0  0x000000000083457d in _zend_is_inconsistent (ht=0x0, 
file=0xcd2b68 "/home/user/php/php-5.4.0/Zend/zend_hash.c", line=919)
at /home/user/php/php-5.4.0/Zend/zend_hash.c:54
54      if (ht->inconsistent==HT_OK) 
...skipped...

有人知道为什么会发生这种情况吗? 谢谢!

【问题讨论】:

【参考方案1】:

zend_hash_find() 的用法是正确的,我在生产中以同样的方式使用它,没有任何问题。 gdb 消息说哈希表 (function_table) 为 NULL,所以我认为问题出在模块的初始化上。如果您粘贴完整的源代码,我们可能会有所帮助:-)

BTW estrndup 在您的情况下不是必需的

【讨论】:

这段代码运行在 PHP_MINIT 阶段。有没有可能,那个function_table还没有初始化? 你能用 CG(function_table) 而不是 EG(function_table) 进行测试吗?

以上是关于运行 zend_hash_find() 时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

运行我的代码时出现分段错误(核心转储)问题

运行 3 个线程时出现分段错误

代码在我的系统上运行良好,但 HackerRank 提交时出现分段错误

在 Nao 上运行暗网分类器时出现分段错误

在 libpthread.so 中运行节点时出现分段错误

运行 MDART 协议时出现 NS 2.35 分段错误(核心转储)