markdown语法修正
修改理由:
此投稿已在 7年前 合并。
内容修改:
| 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 |
关于 LearnKu