markdown语法修正

修改理由:
此投稿已在 5年前 合并。
内容修改:
Old | New | Differences |
---|---|---|
21 | 21 | |
22 | 22 | ### 1、使用 docker 拉取环境 |
23 | 23 | |
24 | ||
24 | ```bash | |
25 | 25 | # 拉取准备好的环境 |
26 | 26 | git clone https://github.com/rovast/docker-examples.git |
27 | 27 | … | … |
30 | 30 | |
31 | 31 | # 启动,会经历一个漫长又不太漫长的等待,看你网速 |
32 | 32 | docker-compose up -d |
33 | ||
33 | ``` | |
34 | 34 | |
35 | 35 | > 关于容器内的环境,大家可以看看 【dockerfile](https://github.com/rovast/docker-autobuild/blob/master/gdb-php-src/7.0.0/Dockerfile) |
36 | 36 | > | … | … |
38 | 38 | |
39 | 39 | 显示如下 |
40 | 40 | |
41 | ||
41 | ```text | |
42 | 42 | Creating network "gdb-php-src_default" with the default driver |
43 | 43 | Creating gdb-php-src ... done |
44 | ||
44 | ``` | |
45 | 45 | |
46 | 46 | ### 2、进入容器 |
47 | 47 | |
48 | ||
48 | ```bash | |
49 | 49 | docker exec -it gdb-php-src bash |
50 | 50 | |
51 | 51 | ### 显示下面的东西,表示你已经进入到容器内了 #### |
52 | 52 | root@71a98d1bc1a6:/home# |
53 | ||
53 | ``` | |
54 | 54 | |
55 | 55 | 我们看看容器内的环境(php 以及 gdb) |
56 | 56 | |
57 | ||
57 | ```bash | |
58 | 58 | ### 我们在容器内看看环境 |
59 | 59 | root@71a98d1bc1a6:/home# ls |
60 | 60 | php-7.0.0 start.md | … | … |
81 | 81 | Copyright (c) 1997-2015 The PHP Group |
82 | 82 | Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies |
83 | 83 | root@71a98d1bc1a6:/home# |
84 | ||
84 | ``` | |
85 | 85 | |
86 | 86 | ## 开火(请在容器内操作) |
87 | 87 | |
88 | 88 | ### 1、新建测试文件 |
89 | 89 | |
90 | ||
90 | ```bash | |
91 | 91 | root@71a98d1bc1a6:/home# vi test.php |
92 | ||
92 | ``` | |
93 | 93 | |
94 | 94 | 输入以下内容 |
95 | ||
95 | ```php | |
96 | 96 | <?php |
97 | 97 | |
98 | 98 | strval(1234); |
99 | ||
99 | ``` | |
100 | 100 | |
101 | 101 | 这个文件干的事情就比较简单了,就是把 -1234[整形] 转换为 -1234[字符串] |
102 | 102 | … | … |
107 | 107 | |
108 | 108 | 输入 `gdb php`,开始调试 |
109 | 109 | |
110 | ||
110 | ```bash | |
111 | 111 | root@71a98d1bc1a6:/home# gdb php |
112 | 112 | GNU gdb (Debian 7.12-6) 7.12.0.20161007-git |
113 | 113 | Copyright (C) 2016 Free Software Foundation, Inc. | … | … |
125 | 125 | Type "apropos word" to search for commands related to "word"... |
126 | 126 | Reading symbols from php...done. |
127 | 127 | (gdb) |
128 | ||
128 | ``` | |
129 | 129 | |
130 | 130 | ### 3、打一些断点(敲命令时可以用 tab 补全) |
131 | 131 | |
132 | ||
132 | ```bash | |
133 | 133 | (gdb) b zend_long_to_str |
134 | 134 | Breakpoint 1 at 0x810423: file /home/php-7.0.0/Zend/zend_operators.c, line 2743. |
135 | 135 | (gdb) b zend_print_ulong_to_buf |
136 | 136 | Breakpoint 2 at 0x5f387b: zend_print_ulong_to_buf. (13 locations) |
137 | 137 | (gdb) |
138 | ||
138 | ``` | |
139 | 139 | |
140 | 140 | 这里在关键函数 `zend_long_to_str` 和 `zend_print_ulong_to_buf` 打了断点。 |
141 | 141 | … | … |
143 | 143 | |
144 | 144 | ### 4、执行,查看断点值 |
145 | 145 | |
146 | ||
146 | ```bash | |
147 | 147 | (gdb) r test.php # 执行我们刚才的那个 PHP 文件 |
148 | 148 | Starting program: /usr/local/bin/php test.php |
149 | 149 | [Thread debugging using libthread_db enabled] | … | … |
162 | 162 | Breakpoint 1, zend_long_to_str (num=-1234) at /home/php-7.0.0/Zend/zend_operators.c:2743 |
163 | 163 | 2743 char *res = zend_print_long_to_buf(buf + sizeof(buf) - 1, num); |
164 | 164 | (gdb) |
165 | ||
165 | ``` | |
166 | 166 | |
167 | 167 | 看的好像不明了嘛, `ctrl` + `x` 后再按 `a` 进入 gui 模式看看 |
168 | 168 | |
169 | ||
169 | ```bash | |
170 | 170 | ┌──/home/php-7.0.0/Zend/zend_operators.c────────────────────────────────────────────────────────────────────────────────────────────────┐ |
171 | 171 | │2731 ZEND_API void ZEND_FASTCALL zend_locale_sprintf_double(zval *op ZEND_FILE_LINE_DC) /* {{{ */ │ |
172 | 172 | │2732 { │ | … | … |
200 | 200 | |
201 | 201 | |
202 | 202 | (gdb) |
203 | ||
203 | ``` | |
204 | 204 | |
205 | 205 | 有点意思了,函数在 2743 行断住了,我们来看看 num 的值 |
206 | 206 | |
207 | ||
207 | ```bash | |
208 | 208 | (gdb) p num |
209 | 209 | $1 = -1234 |
210 | 210 | (gdb) |
211 | ||
211 | ``` | |
212 | 212 | |
213 | 213 | 对嘛,这个就是我们要处理的值,我们全速运行到 `zend_print_long_to_buf` 里看看 |
214 | 214 | |
215 | ||
215 | ```bash | |
216 | 216 | (gdb) c |
217 | 217 | Continuing. |
218 | ||
218 | ``` | |
219 | 219 | |
220 | 220 | 显示如下 |
221 | 221 | |
222 | ||
222 | ```bash | |
223 | 223 | (gdb) c |
224 | 224 | ┌──/home/php-7.0.0/Zend/zend_operators.h────────────────────────────────────────────────────────────────────────────────────────────────┐ |
225 | 225 | │781 else \ │ | … | … |
251 | 251 | │807 } else { │ |
252 | 252 | └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ |
253 | 253 | multi-thre Thread 0x7ffff7fe37 In: zend_print_ulong_to_buf L793 PC: 0x8041fd |
254 | ||
254 | ``` | |
255 | 255 | |
256 | 256 | 接下来,我们来进行一些单步调试,看看内存里的值 |
257 | 257 | |
258 | ||
258 | ```bash | |
259 | 259 | Breakpoint 1, zend_long_to_str (num=-1234) at /home/php-7.0.0/Zend/zend_operators.c:2743 |
260 | 260 | (gdb) c #-------------> 表示继续执行 |
261 | 261 | Continuing. | … | … |
273 | 273 | 0x7fffffffafe0: 49 '1' 50 '2' 51 '3' 52 '4' 0 '\000' 0 '\000' 0 '\000' 0 '\000' |
274 | 274 | 0x7fffffffafe8: 0 '\000' 65 'A' |
275 | 275 | (gdb) |
276 | ||
276 | ``` | |
277 | 277 | |
278 | 278 | 我们看到,函数返回的 buf 是字符串类型的 '1234' |
279 | 279 |