美高梅集团4688gdb调试技巧 找到php执行进度近年来实践的代码

倘使线上有一段php脚本,突然在某天出难点了,不处理可是经过没有脱离。这种情状只怕是相当休眠可能是有段死循环代码,但是我们怎么固定呢,大家那几个时候最想精通的应当是那一个本子在此刻在做哪些吧。那些是gdb+zbacktrace就有用了

简介

   GDB(GNU
debugger)是GNU开源公司发布的3个有力的UNIX下的程序调试工具。能够选拔它经过命令行的章程调试程序。它使你能在程序运营时考察程序的内部结构和内存的应用处境。你也得以利用它分析程序崩溃前的发出了何等,从而找出程序崩溃的案由。相对于windows下的图形界面的VC等调节工具,它提供了更强大的法力。如若想在Windows下拔取gdb,须要设置MinGW或然CygWin,并且需求配备环境变量才可以使用。

   一般的话,gdb完成以下多少个地方的办事:

   一 、运维你的次序,修改部分事物,从而影响程序运转的作为。

   ② 、可以指定断点。程序执行到断点处会暂停实施。

   三 、当你的次序停掉时,你可以用它来察看发生了何等事情。

   ④ 、动态的更动你程序的施行环境,尝试勘误bug。

率先随便写多少个测试脚本test.php,里面就写三个sleep函数,换到死循环也足以。

安装

 
 在设置gdb之前,先明确你的linux操作系统是不是安装了gdb。你可以采纳如下命令来规定是还是不是安装了gdb。

1
#gdb -help

 
 如果已经安装了gdb,那么将会突显它能动用的保有参数。如若没有安装,我们可以透过以下二种格局来设置。

<?php
function Mecho($i){
 echo $i.PHP_EOL;
}
$i = 20;
while($i>0){

if($i%2==0){
  Mecho($i);
}
sleep(100000);
$i--;
}

经过yum命令安装

   通过yum安装的命令行如下:

1
#yum install gdb

zbacktrace下载php源码包里面就有,当前本人的条件是新装的,当前的php版本是php7.2.9

经过rpm包形式安装

 
 从

1
#rpm -ivh ./gdb-7.8.1.rpm

直接cli执行test.php

因此源码格局安装

   安装gdb是很简单的。只要遵循以下步骤一步步操作即可。

 
 壹 、然则安装从前,必须确保它所依靠的环境没难点。上边是它借助的依赖环境。

   * c语言编译器。推荐应用gcc。

   * 确保有不少于150M的磁盘空间。

   ② 、然后打开那么些网址
ftp://sourceware.org/pub/gdb/releases/,下载需求安装的gdb源码包。我们下载的源码包是gdb-7.8.1.tar.gz。

   三 、解压压缩包。压缩包解压甘休后,进入解压后的目录。

1
2
3
#gzip -d gdb-7.8.1.tar.gz
#tar xfv gdb-7.8.1.tar.gz
#cd gdb-7.8.1

   肆 、然后一遍执行如下命令,以便形成安装

1
2
3
#./configure
#make
#make install
php test.php

主导拔取

 然后找到当前php进度

命令行格式

gdb    [-help] [-nx] [-q] [-batch]
[-cd=dir] [-f] [-b bps] [-tty=dev]
[-s symfile] [-e prog] [-se prog] [-c core]
[-x

             cmds] [-d dir] [prog[core|procID]]

   美高梅集团4688 1

常用功效介绍

 
 网上的一对课程基本上都以介绍使用gdb调试c恐怕c++语言编写的次序的。大家那节首要表明什么行使gdb调试php程序。大家的php脚本如下:

   文件名为test.php,代码如下:

1
2
3
4
5
6
<?php
echo "hello \n";
for($i = 0; $i < 10; $i++){    
    echo $i."\n";    
    sleep(10); }
?>

 然后用gdb调试

启动gdb

   运维gdb可以动用如下二种艺术:

   第①种方法:

   运转的时候指定要实施的脚本。

1
2
3
4
5
6
7
#sudo gdb /usr/bin/php
......
Reading symbols from /home/admin/fpm-php5.5.15/bin/php...done.
(gdb) set args ./test.php
(gdb) r
Starting program: /home/admin/fpm-php5.5.15/bin/php ./test.php
......

   运转的时候指定php程序的路线。

   Reading symbols from /home/admin/fpm-php5.5.15/bin/php…done.
表达已经加载了php程序的符号表。

   使用set args 命令指定php命令的参数。

 
 使用r命令开头履行脚本。r即为run的简写格局。也可以行使run命令起初施行脚本。

   第叁种方法:

 
 运行后通过file命令指定要调节的先后。当你采纳gdb调试完多个顺序,想调试此外三个先后时,就可以不脱离gdb便能切换要调节的次第。具体操作步骤如下:

1
2
3
4
5
6
7
8
9
#sudo gdb ~/home/test/exproxy
......
Reading symbols from /home/hailong.xhl/exproxy/test/exproxy...(no debugging symbols found)...done.
(gdb) file /home/admin/fpm-php/bin/php
Reading symbols from /usr/bin/php...done.
(gdb) set args ./test.php
(gdb) r
Starting program: /home/admin/fpm-php5.5.15/bin/php ./test.php
......

 
 上面的例证中我们先采用gdb加载了程序exproxy进行调剂。然后通过file命令加载了php程序,从而切换了要调节的次第。

gdb -p 56571

赢得支持音讯

 
 gdb的子命令很多,或然有点你也不太熟习。没关系,gdb提供了help子命令。通过这几个help子命令,我们可以精通指定子命令的片段用法。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#gdb
......
(gdb) help set
Evaluate expression EXP and assign result to variable VAR, using assignment
syntax appropriate for the current language (VAR = EXP or VAR := EXP for
example).  VAR may be a debugger "convenience" variable (names starting
with $), a register (a few standard names starting with $), or an actual
variable in the program being debugged.  EXP is any valid expression.
Use "set variable" for variables with names identical to set subcommands.
  
With a subcommand, this command modifies parts of the gdb environment.
You can see these environment settings with the "show" command.
  
List of set subcommands:
  
set annotate -- Set annotation_level
set architecture -- Set architecture of target
set args -- Set argument list to give program being debugged when it is started
.......
(gdb) help set args
Set argument list to give program being debugged when it is started.
Follow this command with any number of args, to be passed to the program.
......

 
 可知,通过help命令,大家得以明白命令的功能和利用方式。假使那个子命令还有一对子命令,那么它的全部子命令也会列出来。如上,set命令的set
args等子命令也都列出来了。你还足以行使help命令来询问set
args的更详细的新闻。

 调试

设置断点

 
 为啥要设置断点呢?设置断点后,大家就可以指定程序执行到指定的点后终止。以便我们更详实的跟踪断点附近程序的履行意况。

   设置断点的吩咐是break,缩写方式为b。

   设置断点有无数主意。上边我们举例表明下常用的两种办法。

source /usr/local/src/php-7.2.9/.gdbinit
zbacktrace 

基于文件名和行号指定断点

 

 
 尽管您的程序是用c或然c++写的,那么您可以选用“文件名:行号”的款式设置断点。示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
#gdb /usr/bin/php
(gdb) set  args ./test.php
(gdb) b basic_functions.c:4439
Breakpoint 6 at 0x624740: file /home/php-5.5.15/ext/standard/basic_functions.c, line 4439.
(gdb) r
Starting program: /home/fpm-php5.5.15/bin/php ./test.php
hello
0
Breakpoint 1, zif_sleep (ht=1, return_value=0x7ffff425a398, return_value_ptr=0x0, this_ptr=0x0, return_value_used=0)
    at /home/php_src/php-5.5.15/ext/standard/basic_functions.c:4439
4439    {
(gdb)

   示例中的(gdb) b basic_functions.c:4439
是安装了断点。断点的地点是basic_functions.c文件的4439行。使用r命令执行脚本时,当运维到4439行时就会半途而返。暂停的时候会把断点附近的代码给展现出来。可知,断点处是zif_sleep方法。这个zif_sleep方法就是大家php代码中sleep方法在php内核中的完毕。依照专业,php内置提供的格局名前边加上zif_,就是其一艺术在php内核或许增添中落到实处时定义的办法名。

相关文章