找到php执行进程近来实践的代码,php如何定时执行职分

by admin on 2019年1月31日

若是线上有一段php脚本,突然在某天出难题了,不处理然则经过没有脱离。那种气象或者是相当休眠或者是有段死循环代码,但是大家怎么固定呢,大家这几个时候最想了然的应当是那个本子在那时在做哪些吧。那些是gdb+zbacktrace就有用了

简介

   GDB(GNU
debugger)是GNU开源公司颁发的一个无敌的UNIX下的程序调试工具。可以选用它经过命令行的点子调试程序。它使你能在程序运行时考察程序的内部结构和内存的运用意况。你也得以动用它分析程序崩溃前的暴发了何等,从而找出程序崩溃的来由。绝对于windows下的图形界面的VC等调节工具,它提供了更强硬的效果。如果想在Windows下行使gdb,须求安装MinGW或者CygWin,并且需求配置环境变量才方可选取。

   一般的话,gdb达成以下三个方面的行事:

   1、启动你的主次,修改部分东西,从而影响程序运行的行为。

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

   3、当您的次序停掉时,你可以用它来察看暴发了怎么业务。

   4、动态的改观你程序的施行环境,尝试核对bug。

PHP的落实控制了它并未Java和.Net这种AppServer的定义,
而http商事是一个无状态的协议, php只可以被用户触发, 被调用,
调用后会自动退出内存, 没有常驻内存, 就没有艺术准确的定时处理那么,
借使需求用PHP定时实施某些职分以来, 可以有以下俩个法子:

在Linux下要让一个脚本挂在后台执行可以在指令的末段加上一个 “&”
符号,有时候这还不够,必要借助nohup命令,关于nohup,

首先随便写一个测试脚本test.php,里面就写一个sleep函数,换成死循环也可以。

安装

 
 在安装gdb在此以前,先确定你的linux操作系统是不是安装了gdb。你可以利用如下命令来规定是还是不是安装了gdb。

1
#gdb -help

 
 假若已经安装了gdb,那么将会呈现它能利用的持有参数。即使没有安装,我们得以经过以下三种办法来设置。

Linux下crontab, windows下布置职务找个被频仍调用的网页,
里面加上一个检测代码set_time_limit(0);ignore_user_abort(true);死循环首个格局是最广泛的,
即使php服务器上并未权限去crontab,
也可以找一个祥和的机器定期crontab去央浼服务器第三种方式,
论坛上定时清理新帖基本上就是那样完毕的, 假若人气不旺的话,
可以考虑去其余火爆点的论坛里面发个图片,
调用自己的php来完毕一个trigger就好了。
Discuz!是判定在00:00将来,第四个执行者去履行的。第两种相比不可信赖,
Apache重启了就得重新访问,  fastcgi倒是会好一点。

玩过Linux的人应有都精晓,即使想让一个程序在后台运行,只要在执行命令的末梢加上一个&符号就能够了。不过那种方法不是很有限支撑,有些程序当您登出终极后它就会为止。那么怎样让一个顺序真的永远在后台执行呢。答案就是选取nohub 命令,格式为:

<?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

上边的那段代码,可以在现阶段文件夹下,生成一个test.txt,并每隔20秒,往里面写入一个小时戳,无论客户端是或不是关闭浏览器。

nohup 执行顺序的一声令下 &

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

经过rpm包情势安装

 
 从

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

<?php
ignore_user_abort(true);set_time_limit(0);functionwrite_txt()
{if(!file_exists(”test.txt”)){$fp=fopen(”test.txt”,”wb”);fclose($fp);}$str=file_get_contents(’test.txt’);$str.=
“\r\n”.date(”H:i:s”);$fp=fopen(”test.txt”,”wb”);fwrite($fp,$str);fclose($fp);}functiondo_cron(){usleep(20000000);write_txt();}while(1){do_cron();}

一经程序有出口,它会试着把出口写入执
行上述命令的方今文件夹下的 nohup.out
文件中,当写入战败,就会写当前用户的$HOME目录下的nohup.out 中。

直接cli执行test.php

通过源码方式安装

   安装gdb是很不难的。只要根据以下步骤一步步操作即可。

 
 1、不过安装此前,必须确保它所看重的环境没难题。上边是它依靠的借助环境。

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

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

   2、然后打开那几个网址
ftp://sourceware.org/pub/gdb/releases/,下载须要设置的gdb源码包。大家下载的源码包是gdb-7.8.1.tar.gz。

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

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

   4、然后五次施行如下命令,以便形成安装

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

重点的五个函数:

 

php test.php

中央采纳

ignore_user_abort(true),那几个函数的成效是,无论客户端是或不是关闭浏览器,下边的代码都将取得推行。

CLI环境和Web环境举办的操作还不太一样。先来说CLI环境,那里要求用上nohup和&,同时还要把指定输出,如若不想要输出结果,可以把出口定向到/dev/null中。现在来做一个测试,假如在一个索引中有main.php、sub1.php和sub2.php,其中sub1和sub2内容一律都让sleep函数暂停一段时间。代码如下:

 然后找到当前php进度

指令行格式

找到php执行进程近来实践的代码,php如何定时执行职分。gdb    [-help] [-nx] [-q] [找到php执行进程近来实践的代码,php如何定时执行职分。-batch]
[-cd=dir] [-f] [-b bps] [-tty=dev]
[-s symfile] [-e prog] [-se prog] [-c core]
[-x

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

set_time_limit(0),那一个函数的功力是,废除php文件的施行时间,假设没有这么些函数的话,默许php的实践时间是30秒,也就是说30秒后,那些文件就say
goodbay了。

 代码如下

   bf88必发唯一官网 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); }
?>

另外usleep在PHP5.0之后,支持windows操作系统。

//main.php
<?php
    $cmd = ‘nohup php ./sub.php >./tmp.log  &’;
    exec($cmd);
    $cmd = ‘nohup php ./sub1.php >/dev/null  &’;
    exec($cmd);
?>

 然后用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程序,从而切换了要调节的程序。

俺们在做一个php
邮件出殡难题是平日会遇见那样的题材,就是用户订阅一些资料须求定时发送到用户的信箱中去。去网上搜寻了瞬间,发现在如此的稿子不多,本文介绍了一种用PHP完毕的格局,作者用PHP的时间不长,欢迎我们PP。

//sub1.php sub2.php
<?php
    sleep(100000);
?>

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的更详实的音讯。

一、要落到实处定时发送,主要解决难题是定时。

上述文件中main.php是当做主脚本,在命令行中执行php
main.php,可以见见main.php脚本很快就实施完并退出。在采纳ps
aux | grep
sub命令搜索进度,应该可以在后台看到上述的多个子脚本,表明成功挂起了子脚本。

 调试

设置断点

 
 为啥要安装断点呢?设置断点后,大家就足以指定程序执行到指定的点后终止。以便我们更详尽的跟踪断点附近程序的实施处境。

   设置断点的下令是break,缩写方式为b。

   设置断点有许多艺术。下边大家举例表达下常用的三种办法。

  大家在写程序时索要加个什么if
某个时刻=某个时间则发送,不过要兑现那几个进度,面临的难题是,大家要实践那个页面才能发送。所以主要解决的标题是怎么到时让服务器定时实施这么些页面,那样落成起来好像相比较不方便。

在Web环境下,执行php脚本都是Web服务器开启的cgi进度来拍卖,只要脚本不脱离,就会直接占有该cgi进度,当启动的兼具cgi进度都被占据完后就不可以在拍卖新的请求。所以对那么些可能会很费力的台本,可以动用异步的法子。启动子脚本的法子和CLI几乎,必须求使用&和指定输出(只可以是定向到/dev/null),可是不可以接纳nohup。例如:

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内核或者扩张中达成时定义的艺术名。

二、我查看PHP手册,找到了PHP
的命令行形式这一章,发现能缓解这一难题,指出大家如果想用这么些方法的话先看看这一章。

 代码如下

bf88必发唯一官网 2

依据文件名和方式名指定断点

 
 有些时候,手头尚无源代码,不驾驭要打断点的具体地点。但是大家按照php的命名规范知道方法名。如,大家知晓php程序中调用的sleep方法,在
php内核中完成时的点子名是zif_sleep。那时,我们就能够通过”文件名:方法名”的艺术打断点。示例如下:

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:zif_sleep
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)

   其它,即使您不知晓文书名的话,你也得以只指定方法名。命令示例如下:

1
2
3
......
(gdb)b zif_sleep
......

三、解决办法:

<?php
    $cmd = ‘php PATH_TO_SUB1/sub1.php >/dev/null  &’;
    exec($cmd);
    $cmd = ‘php PATH_TO_SUB1/sub2.php >/dev/null  &’;
    exec($cmd);
?>

 那些时候就知道了是在test.php的11行 sleep函数导致的长河sleep。

设置标准断点

 
 如若按上面的点子设置断点后,每回执行到断点地方都会停顿。有时候分外厌恶。大家只想在指定条件下才中断。这时候根据规则设置断点就有了用武之地。设置条件断点的款型,就是在设置断点的中央格局背后扩充if条件。示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
......
(gdb) b zif_sleep if num > 0
Breakpoint 9 at 0x624740: file /home/php_src/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 9, 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)
......

1、在 Windows 平台下您可以将cli\php.exe 和 .php
文件的双击属性相关联,您也足以编制一个批处理公事来用 PHP
执行脚本。我们把写好的次序放在一个索引下如 E:\web\mail.php

当在浏览器中走访该脚本文件,可以观察浏览器里面响应落成,同时采取ps命令查看后台可以见到sub1和sub2脚本。

  

查阅断点

   可以采纳info
breakpoint查看断点的图景。包含都安装了那么些断点,断点被命中的次数等音信。示例如下:

1
2
3
4
5
6
7
8
......
(gdb) info breakpoint
Num     Type           Disp Enb Address            What
9       breakpoint     keep y   0x0000000000624740 in zif_sleep at /home/admin/php_src/php-5.5.15/ext/standard/basic_functions.c:4439
    stop only if num > 0
    breakpoint already hit 1 time
10      breakpoint     keep y   0x0000000000624740 in zif_sleep at /home/admin/php_src/php-5.5.15/ext/standard/basic_functions.c:4439
......

下一场写一个windows批处理文件内容如下。

小心上述例子中一经php命令不在PATH中,必要指定命令完整的门道。推荐应用完全路径,更加是在Web下

 

去除断点

   对于低效的断点大家可以去除。删除的命令格式为 delete breakpoint
断点编号。info
breakpoint命令突显结果中的num列就是数码。删除断点的以身作则如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
......
(gdb) info breakpoints
Num     Type           Disp Enb Address            What
9       breakpoint     keep y   0x0000000000624740 in zif_sleep at /home/admin/php_src/php-5.5.15/ext/standard/basic_functions.c:4439
    stop only if num > 0
    breakpoint already hit 1 time
10      breakpoint     keep y   0x0000000000624740 in zif_sleep at /home/admin/php_src/php-5.5.15/ext/standard/basic_functions.c:4439
(gdb) info breakpoint
Num     Type           Disp Enb Address            What
9       breakpoint     keep y   0x0000000000624740 in zif_sleep at /home/admin/php_src/php-5.5.15/ext/standard/basic_functions.c:4439
    stop only if num > 0
    breakpoint already hit 1 time
10      breakpoint     keep y   0x0000000000624740 in zif_sleep at /home/admin/php_src/php-5.5.15/ext/standard/basic_functions.c:4439
(gdb) delete 9
(gdb) info breakpoint
Num     Type           Disp Enb Address            What
10      breakpoint     keep y   0x0000000000624740 in zif_sleep at /home/admin/php_src/php-5.5.15/ext/standard/basic_functions.c:4439
(gdb)
......

   上边的例证中大家删除了编号为9的断点。

@D:\php\cli\php.exe E:\web\mail.php >d:\php\cli\sendmail.log

翻开代码

 
 断点设置完后,当程序运行到断点处就会搁浅。暂停的时候,大家得以查看断点附近的代码。查看代码的子命令是list,缩写格局为l。呈现的代码行数为10行,基本上以断点处为主导,向上向下各突显几行代码。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#gdb /usr/bin/php
(gdb) set  args ./test.php
(gdb) b basic_functions.c:zif_sleep
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)l
4434    /* }}} */
4435   
4436    /* {{{ proto void sleep(int seconds)
4437       Delay for a given number of seconds */
4438    PHP_FUNCTION(sleep)
4439    {
4440        long num;
4441   
4442        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
4443            RETURN_FALSE;

   其它,你可以可以透过点名行号或者措施名来查算命关代码。

   指定行号查看代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
......
(gdb) list 4442
4437       Delay for a given number of seconds */
4438    PHP_FUNCTION(sleep)
4439    {
4440        long num;
4441   
4442        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
4443            RETURN_FALSE;
4444        }
4445        if (num < 0) {
4446            php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of seconds must be greater than or equal to 0");
......

bf88必发唯一官网 ,   指定方法名查看代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
......
(gdb) list zif_sleep
4434    /* }}} */
4435   
4436    /* {{{ proto void sleep(int seconds)
4437       Delay for a given number of seconds */
4438    PHP_FUNCTION(sleep)
4439    {
4440        long num;
4441   
4442        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
4443            RETURN_FALSE;
......

Pause

单步执行

 
 断点附近的代码你询问后,那时候你就可以选择单步执行一条一条语句的去履行。可以随时查阅执行后的结果。单步执行有多少个指令,分别是step和next。那七个指令的分别在于:

   step 一条语句一条语句的实践。它有一个别名,s。

   next
和step类似。只是当蒙受被调用的办法时,不会进去到被调用方法中一条一条语句执行。它有一个别名n。

   可能您对那七个指令还有些迷惑。上边我们用八个例证来给您演示下。

   step命令示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#gdb /usr/bin/php
(gdb) set  args ./test.php
(gdb) b basic_functions.c:zif_sleep
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) s
4442        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
(gdb) s
zend_parse_parameters (num_args=1, type_spec=0x81fc41 "l") at /home/admin/php_src/php-5.5.15/Zend/zend_API.c:917
917 {

 
 可知,step命令进入到了被调用函数中zend_parse_parameters。使用step命令也会在这么些方法中一行一行的单步执行。

   next命令示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#gdb /usr/bin/php
(gdb) set  args ./test.php
(gdb) b basic_functions.c:zif_sleep
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) n
4442        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
(gdb) n
4445        if (num < 0) {

   可知,使用next命令只会在本方法中单步执行。

那个D:\php\cli\php.exe是自己的PHP安装文件所在目录。Php.exe就是windows PHP命令行形式的次第。

继续执行

 
 run命令是从头初始执行,若是我们只是想继续执行就足以选拔continue命令。它的机能就是从暂停处继续执行。命令的简写方式为c。继续执行进程中相见断点或者观望点变化仍旧会停顿。示例代码如下:

1
2
3
4
5
6
7
8
9
......
(gdb) c
Continuing.
6
  
Breakpoint 1, zif_sleep (ht=1, return_value=0x7ffff425a398, return_value_ptr=0x0, this_ptr=0x0, return_value_used=0)
    at /home/admin/php_src/php-5.5.15/ext/standard/basic_functions.c:4439
4439    {
......

好的,大家保留那么些文件为mail.bat然后的windows中的布置任务中添加一个任务,让操作系统在某个时间来运转这些批处理公事。

翻开变量

 
 现在你早已会安装断点,查看断点附近的代码,并得以单步执行和继续执行。接下来你也许会想清楚程序运行的一部分景观,如查看变量的值。print命令正好满意了你的须求。使用它打印出变量的值。print命令的简写方式为p。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
......
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) n
4442        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &num) == FAILURE) {
(gdb) n
4445        if (num < 0) {
(gdb) print num
$1 = 10
(gdb)
......

 
 打印出的num的值为10,正好是我们在php代码中调用sleep方法传的值。其余可以动用“print/x
my var” 的款型得以以十六进制形式查看变量值。

2、如果您使用 Unix 系统,您须求在您的 PHP
脚本的最前方加上一行特殊的代码,使得它亦可被实施,那样系统就能领悟用哪些的程序要运行该脚本。为
Unix 系统扩展的首先行代码不会影响该脚本在Windows
下的运转,因而你也足以用该办法编写跨平台的脚本程序。

设置变量

 
 使用print命令查看了变量的值,如若觉得那几个值不切合预期,想修改下这些值,再看下执行职能。这种情状下,大家该怎么做吧?平时情况下,大家会修改代码,再重复履行代码。使用gdb的set命令,一切将变得更简短。set命令可以一直改动变量的值。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
......
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) print num
$4 = 10
(gdb) set num = 2
(gdb) print num
$5 = 2
......

   上边的代码中大家是把sleep函数传入的10改为了2。即,sleep
2秒。注意,大家演示中修改的变量num是一些变量,只好对此次函数调用有效。下次再调用zif_sleep方法时,又会被安装为10。

 ignore_user_abort();//关掉浏览器,PHP脚本也可以持续执行.set_time_limit(0);//通过set_time_limit(0)可以让程序无界定的执行下去$interval=60*30;//每隔半钟头运转do{//那里是您要履行的代码sleep($interval);//等待5秒钟}while(true);

安装观看点

 
 设置寓目点的成效就是,当被阅览标变量发生变化后,程序就会暂停实施,并把变量的原值和新值都会显示出来。设置观察点的通令是watch。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
......
(gdb) watch num
Hardware watchpoint 3: num
(gdb) c
Continuing.
Hardware watchpoint 3: num
  
Old value = 1
New value = 10
0x0000000000713333 in zend_parse_arg_impl (arg_num=1, arg=0x7ffff42261a8, va=0x7fffffffaf70, spec=0x7fffffffaf30, quiet=0)
    at /home/admin/php_src/php-5.5.15/Zend/zend_API.c:372
372                         *p = Z_LVAL_PP(arg);
(gdb)
......

 
 上例中num值从1变成了10时,程序暂停了。须求注意的是,你的次序中或者有七个同名的变量。那么使用watch命令会观察越发变量呢?这么些要依靠于变量的成效域。即,在采纳watch设置观看点时,可以直接访问的变量就是被观望的变量。

其他有效的授命

   backtrace 简写格局为bt。查看程序执行的库房音讯。

   finish  执行到目前函数的为止

 

 

 命令  解释  示例
file <文件名> 加载被调试的可执行程序文件。
因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径。
(gdb) file gdb-sample
r Run的简写,运行被调试的程序。
如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。
(gdb) r
c Continue的简写,继续执行被调试程序,直至下一个断点或程序结束。 (gdb) c
b <行号>
b <函数名称>
b *<函数名称>
b *<代码地址>

d [编号]

b: Breakpoint的简写,设置断点。两可以使用“行号”“函数名称”“执行地址”等方式指定断点位置。
其中在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。如果不了解汇编,可以不予理会此用法。

d: Delete breakpoint的简写,删除指定编号的某个断点,或删除所有断点。断点编号从1开始递增。

(gdb) b 8
(gdb) b main
(gdb) b *main
(gdb) b *0x804835c

(gdb) d

s, n s: 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;
n: 执行一行源程序代码,此行代码中的函数调用也一并执行。

s 相当于其它调试器中的“Step Into (单步跟踪进入)”;
n 相当于其它调试器中的“Step Over (单步跟踪)”。

这两个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)。

(gdb) s
(gdb) n
si, ni si命令类似于s命令,ni命令类似于n命令。所不同的是,这两个命令(si/ni)所针对的是汇编指令,而s/n针对的是源代码。 (gdb) si
(gdb) ni
p <变量名称> Print的简写,显示指定变量(临时变量或全局变量)的值。 (gdb) p i
(gdb) p nGlobalVar
display …

undisplay <编号>

display,设置程序中断后欲显示的数据及其格式。
例如,如果希望每次程序中断后可以看到即将被执行的下一条汇编指令,可以使用命令
“display /i $pc”
其中 $pc 代表当前汇编指令,/i 表示以十六进行显示。当需要关心汇编代码时,此命令相当有用。

undispaly,取消先前的display设置,编号从1开始递增。

(gdb) display /i $pc

(gdb) undisplay 1

i Info的简写,用于显示各类信息,详情请查阅“help i”。 (gdb) i r
q Quit的简写,退出GDB调试环境。 (gdb) q
help [命令名称] GDB帮助命令,提供对GDB名种命令的解释说明。
如果指定了“命令名称”参数,则显示该命令的详细说明;如果没有指定参数,则分类显示所有GDB命令,供用户进一步浏览和查询。
(gdb) help display

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图