coredump是由php-cgi产生的,不好调式。一是无法对php-cgi充分请求,以复现core,二是我在lirui04的机器上,gdb run给php-cgi传参数时,提示--fpm这个参数有问题。
根据coredump的调用栈信息,core最终出在fwrite标准库函数,根据理论和经验,可能导致fwrite出core的,依次是其第4个参数和第1个参数。
根据qrencode.c中对libpng的使用,结合libpng-1.2.8的源码,得出以下临时的solution,理论上可以解决这个具体的问题:
/******************************
* customized for libpng-1.2.8
* to avoid fwrite's segmentation fault
* @reference:
* pngwutil.c:133
* PngFile.c:419
* pngwio.c:52
* png.h:1073 1054 1130
* XXX: this macro's augument was refered more than once
******************************/
#define CUSTOMIZED_CHECK_PNG_PTR(png_ptr) \
do { \
if (!(png_ptr) \
|| (int)((png_ptr)->sig_bytes) > 7 \
|| (int)((png_ptr)->sig_bytes) < 0 \
|| !(png_ptr)->io_ptr) { \
/* return from PHP method or throw an exception, and release related resources if any */ \
} \
} while (0)
在qrencode.c的546行之前,定义上面的宏,并在545行之后、546行之前,调用此宏,CUSTOMIZED_CHECK_PNG_PTR(png_ptr);。
根据coredump的调用栈信息,core最终出在fwrite标准库函数,根据理论和经验,可能导致fwrite出core的,依次是其第4个参数和第1个参数。
根据qrencode.c中对libpng的使用,结合libpng-1.2.8的源码,得出以下临时的solution,理论上可以解决这个具体的问题:
/******************************
* customized for libpng-1.2.8
* to avoid fwrite's segmentation fault
* @reference:
* pngwutil.c:133
* PngFile.c:419
* pngwio.c:52
* png.h:1073 1054 1130
* XXX: this macro's augument was refered more than once
******************************/
#define CUSTOMIZED_CHECK_PNG_PTR(png_ptr) \
do { \
if (!(png_ptr) \
|| (int)((png_ptr)->sig_bytes) > 7 \
|| (int)((png_ptr)->sig_bytes) < 0 \
|| !(png_ptr)->io_ptr) { \
/* return from PHP method or throw an exception, and release related resources if any */ \
} \
} while (0)
在qrencode.c的546行之前,定义上面的宏,并在545行之后、546行之前,调用此宏,CUSTOMIZED_CHECK_PNG_PTR(png_ptr);。