低级错误:c头文件定义错误,外部调用返回类型发生转换

分类: php,php扩展开发 发布时间: 2015-09-24 16:03 浏览: 832 次

最近在使用php扩展写一个php框架,遇到挺多问题。
搞了两天,各种调试,不容易啊,终于发现了我的低级错误,分享给大家!

在开发php扩展的时候,我把所有公用方法独立到一个c文件里,并配了一个头文件h,就是这个头文件,我是从另一个头文件复制修改来的,我把顶部的宏定义也复制了,导致整个头文件实际是没有生效的,外部c文件里的方法调用这些方法就不知返回类型,默认成了int类型,导致返回的指针地址无故被转换,前面被补了一些字节。

#ifndef BW_FUNCTION_H//原文件定义过了,所以复制的这个头文件下面的代码都没有生效
#define BW_FUNCTION_H

编译时报了警告,可却被我忽略了

warning: cast from pointer to integer of different size

gdb调试到返回调用处,报下面的错误,然后程序就退出了,这是指针地址无效。

Program received signal SIGSEGV, Segmentation fault.

不过这个过程也让我学到了很多调试的方法,也分享给大家。

gcc -E -P -I/data/software/php-5.5.25/main -I/data/software/php-5.5.25/Zend -I/usr/local/php5/include/php/Zend/ -I/usr/local/php5/include/php/TSRM -I/usr/local/php5/include/php/main/ -I/usr/local/php5/include/php bw_framework.c >bw_framework.e

用这个代码可以展开所有的头文件还有宏定义,看到最直接的代码,就是这个命令让我发现了上面头文件其实是没有被包含进去的。

gdb调试php扩展的过程(需求添加调试选项,在后面文章讲):

gdb /usr/local/php5/bin/php //启动php
break function_a //设置断点(nm binwin.so 可以查看函数表)
run binwin.php //执行php文件

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!