低级错误:c头文件定义错误,外部调用返回类型发生转换
最近在使用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文件