0302 GDB調試走起【給PHP寫插件】

編譯安裝

cd /home/parallels/Software/SysSoftware/php7internal/PHPtest/php-7.2.29


#Zend:核心源碼

# 查看配製選項,重要的是SAPI中的fpm,--debug,在make的時候gcc是o0,不會優化, 會顯示細節,默認-o2
[parallels@eduline php-7.2.29]$ ./configure -h

./configure --prefix=/home/parallels/Sys/php71 --enable-fpm --enable-debug

make && make install

#可以看到過程
-I/usr/include -g -fvisibility=hidden **-O0** -Wall -DZEND_SIGNALS   -c /home/parallels/Software/SysSoftware/php7internal/PHPtest/php-7.2.29/Zend/zend_objects.c -o Zend/zend_objects.lo
/bin/sh /home/parallels/Software/SysSoftware/php7internal/PHPtest/php-7.2.29/libtool --silent --preserve-dup-deps --mode=compile cc 	-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 -IZend/ -I/home/parallels/Software/SysSoftware/php7internal/PHPtest/php-7.2.29/Zend/ -DPHP_ATOM_INC -I/home/parallels/Software/SysSoftware/php7internal/PHPtest/php-7.2.29/include -I/home/parallels/Software/SysSoftware/php7internal/PHPtest/php-7.2.29/main -I/home/parallels/Software/SysSoftware/php7internal/PHPtest/php-7.2.29 -I/home/parallels/Software/SysSoftware/php7internal/PHPtest/php-7.2.29/ext/date/lib -I/usr/include/libxml2 -I/home/parallels/Software/SysSoftware/php7internal/PHPtest/php-7.2.29/ext/sqlite3/libsqlite -I/home/parallels/Software/SysSoftware/php7internal/PHPtest/php-7.2.29/TSRM -I/home/parallels/Software/SysSoftware/php7internal/PHPtest/php-7.2.29/Zend
 
#安裝完成
Installing shared extensions:     /home/parallels/Sys/php71/lib/php/extensions/debug-non-zts-20170718/
Installing PHP CLI binary:        /home/parallels/Sys/php71/bin/
Installing PHP CLI man page:      /home/parallels/Sys/php71/php/man/man1/
Installing PHP FPM binary:        /home/parallels/Sys/php71/sbin/
Installing PHP FPM defconfig:     /home/parallels/Sys/php71/etc/
Installing PHP FPM man page:      /home/parallels/Sys/php71/php/man/man8/
Installing PHP FPM status page:   /home/parallels/Sys/php71/php/php/fpm/
Installing phpdbg binary:         /home/parallels/Sys/php71/bin/
Installing phpdbg man page:       /home/parallels/Sys/php71/php/man/man1/
Installing PHP CGI binary:        /home/parallels/Sys/php71/bin/
Installing PHP CGI man page:      /home/parallels/Sys/php71/php/man/man1/
Installing build environment:     /home/parallels/Sys/php71/lib/php/build/
Installing header files:          /home/parallels/Sys/php71/include/php/
Installing helper programs:       /home/parallels/Sys/php71/bin/
  program: phpize
  program: php-config
Installing man pages:             /home/parallels/Sys/php71/php/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /home/parallels/Sys/php71/lib/php/
[PEAR] Archive_Tar    - installed: 1.4.8
[PEAR] Console_Getopt - installed: 1.4.3
[PEAR] Structures_Graph- installed: 1.1.1
[PEAR] XML_Util       - installed: 1.4.3
[PEAR] PEAR           - installed: 1.10.10
Warning! a PEAR user config file already exists from a previous PEAR installation at '/root/.pearrc'. You may probably want to remove it.
Wrote PEAR system config file at: /home/parallels/Sys/php71/etc/pear.conf
You may want to add: /home/parallels/Sys/php71/lib/php to your php.ini include_path
/home/parallels/Software/SysSoftware/php7internal/PHPtest/php-7.2.29/build/shtool install -c ext/phar/phar.phar /home/parallels/Sys/php71/bin
ln -s -f phar.phar /home/parallels/Sys/php71/bin/phar
Installing PDO headers:           /home/parallels/Sys/php71/include/php/ext/pdo/
# php 位置
/usr/local/Cellar/[email protected]

zval

// 位置:/usr/local/Cellar/[email protected]/7.2.27/include/php/Zend/zend_types.h
typedef union _zend_value {
	zend_long         lval;				/* long value */
	double            dval;				/* double value */
	zend_refcounted  *counted;
	zend_string      *str;
	zend_array       *arr;
	zend_object      *obj;
	zend_resource    *res;
	zend_reference   *ref;
	zend_ast_ref     *ast;
	zval             *zv;
	void             *ptr;
	zend_class_entry *ce;
	zend_function    *func;
	struct {
		uint32_t w1;
		uint32_t w2;
	} ww;
} zend_value;

struct _zval_struct {
	zend_value        value;			/* value */
	union {
		struct {
			ZEND_ENDIAN_LOHI_4(
				zend_uchar    type,			/* active type */
				zend_uchar    type_flags,
				zend_uchar    const_flags,
				zend_uchar    reserved)	    /* call info for EX(This) */
		} v;
		uint32_t type_info;
	} u1;
	union {
		uint32_t     next;                 /* hash collision chain */
		uint32_t     cache_slot;           /* literal cache slot */
		uint32_t     lineno;               /* line number (for ast nodes) */
		uint32_t     num_args;             /* arguments number for EX(This) */
		uint32_t     fe_pos;               /* foreach position */
		uint32_t     fe_iter_idx;          /* foreach iterator index */
		uint32_t     access_flags;         /* class constant access flags */
		uint32_t     property_guard;       /* single property guard */
		uint32_t     extra;                /* not further specified */
	} u2;
};

//搜索is_long
/* regular data types */
#define IS_UNDEF					0
#define IS_NULL						1
#define IS_FALSE					2
#define IS_TRUE						3
#define IS_LONG						4
#define IS_DOUBLE					5
#define IS_STRING					6
#define IS_ARRAY					7
#define IS_OBJECT					8
#define IS_RESOURCE					9
#define IS_REFERENCE				10

//搜索:
/* zval.u1.v.type_flags */
#define IS_TYPE_CONSTANT			(1<<0)
#define IS_TYPE_REFCOUNTED			(1<<2)
#define IS_TYPE_COPYABLE			(1<<4)


gdb 調試

UNIX及UNIX-like下的調試工具。或許,各位比較喜歡那種圖形界面方式的,像VC、BCB等IDE的調試,但如果你是在 UNIX平臺下做軟件,你會發現GDB這個調試工具相比於VC、z的優點是具有修復網絡斷點以及恢復鏈接等功能,比BCB的圖形化調試器有更強大的功能。

[root@eduline php-7.2.29]# yum install gdb
#進入調試模式
gdb /home/parallels/Sys/php71/bin/php
#打斷點
b ZEND_ECHO_SPEC_CV_HANDLER
#運行
r /home/parallels/Software/SysSoftware/php7internal/chapter3/zval.php

#進入下一個斷點continue
c

#單步執行next
n

# 查看指針
(gdb) p z
$1 = (zval *) 0x7ffff5e1e080
# 取值
(gdb) p *z
$2 = {value = {lval = 2, dval = 9.8813129168249309e-324,
    counted = 0x2, str = 0x2, arr = 0x2, obj = 0x2, res = 0x2,
    ref = 0x2, ast = 0x2, zv = 0x2, ptr = 0x2, ce = 0x2, func = 0x2,
    ww = {w1 = 2, w2 = 0}}, u1 = {v = {type = 4 '\004',
      type_flags = 0 '\000', const_flags = 0 '\000',
      reserved = 0 '\000'}, type_info = 4}, u2 = {next = 0,
    cache_slot = 0, lineno = 0, num_args = 0, fe_pos = 0,
    fe_iter_idx = 0, access_flags = 0, property_guard = 0, extra = 0}}
# 下一步
(gdb) n

# 問題:
Missing separate debuginfos, use: debuginfo-install glibc-2.17-292.el7.x86_64 libxml2-2.9.1-6.el7_2.3.x86_64 nss-softokn-freebl-3.44.0-8.el7_7.x86_64 xz-libs-5.2.2-1.el7.x86_64 zlib-1.2.7-18.el7.x86_64

# 查找:debuginfo-install
yum whatprovides debuginfo-install

# 安裝
yum install yum-utils

# 安裝:
debuginfo-install glibc-2.17-292.el7.x86_64 libxml2-2.9.1-6.el7_2.3.x86_64 nss-softokn-freebl-3.44.0-8.el7_7.x86_64 xz-libs-5.2.2-1.el7.x86_64 zlib-1.2.7-18.el7.x86_64

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章