PHP是一種常用的服務器端編程語言,當我們編寫PHP程序出現問題時,如何才能快速地定位到問題?這時候,php gdb就派上用場了。
php gdb是一個調試工具,能夠幫助我們定位到PHP程序的潛在問題,比如語法錯誤、變量值的錯誤等。
舉個例子,假設我們有一個PHP程序:
執行這個程序會觸發一個除零錯誤,程序會中斷。這時候,我們可以使用php gdb來幫助我們找到問題。
步驟如下:
$ gdb -q /usr/bin/php
(gdb) r script.php
第一行是進入gdb模式,第二行是運行我們的PHP程序(script.php)。運行后,我們會看到一個類似下面的結果:
Program received signal SIGFPE, Arithmetic exception.
zend_compile_expr_common (bp=, ast=0x7f9ec5c3f478)
at /usr/src/debug/php-5.6.17/Zend/zend_language_parser.c:2612
2612 /usr/src/debug/php-5.6.17/Zend/zend_language_parser.c: No such file or directory.
(gdb)
這個結果告訴我們,我們的程序觸發了一個SIGFPE信號。這通常意味著我們的程序出現了一個除零錯誤。
接下來,我們可以使用backtrace命令來查看函數調用棧:
(gdb) bt
#0 zend_compile_expr_common (bp=, ast=0x7f9ec5c3f478)
at /usr/src/debug/php-5.6.17/Zend/zend_language_parser.c:2612
#1 0x00000000008dcaa7 in zend_compile_simple_encapsed_node (ast=0x7f9ec5c3f478,
op_array=0x7f9ec5c67e68, *ret_node=0x7f9ec5c68e38, literal_only=0 '\000')
at /usr/src/debug/php-5.6.17/Zend/zend_language_parser.c:2866
#2 0x0000000000937fb0 in zend_compile_node (op_array=0x7f9ec5c67e68, node=0x7f9ec5c3f468)
at /usr/src/debug/php-5.6.17/Zend/zend_language_scanner.l:958
#3 0x00000000008db13c in zend_compile_stmt (op_array=0x7f9ec5c67e68,
statement=0x7f9ec5c3f418) at /usr/src/debug/php-5.6.17/Zend/zend_language_parser.c:2441
以上的結果告訴我們,問題出現在zend_compile_expr_common()函數內部,而且這個函數被調用了三次。
最后,我們可以使用print命令查看變量的值,找出錯誤原因:
(gdb) p $a
$1 = (zval *) 0x7f9ec5c3f5a8
(gdb) p $b
$2 = (zval *) 0x7f9ec5c3f5f0
可以看到,$b的值為0,這就是導致除零錯誤的原因。
上面的例子只是一個簡單的例子,在實際的生產環境中,我們也可以使用php gdb來定位其他問題。
總之,php gdb是一個非常有用的工具,可以幫助PHP程序員快速定位問題,提高工作效率。
下一篇php gd2擴展