【美高梅开户网址】php怎么写定时职分,gdb调试技巧

倘若线上有一段php脚本,突然在某天出难点了,不处理不过经过没有脱离。这种气象大概是那么些休眠只怕是有段死循环代码,不过我们怎么定位呢,大家以此时候最想明白的相应是那几个本子在那时候在做什么样啊。这一个是gdb+zbacktrace就有用了

简介

   GDB(GNU
debugger)是GNU开源集团发表的一个强大的UNIX下的程序调试工具。可以动用它经过命令行的法子调试程序。它使您能在程序运营时观望程序的内部结构和内存的应用意况。你也得以利用它分析程序崩溃前的发生了什么样,从而找出程序崩溃的因由。相对于windows下的图形界面的VC等调节工具,它提供了更强大的功用。尽管想在Windows下选择gdb,要求设置MinGW恐怕CygWin,并且须求配备环境变量才得以应用。

   一般的话,gdb完结以下八个方面的干活:

   壹 、运维你的程序,修改部分事物,从而影响程序运转的表现。

   ② 、能够内定断点。程序执行到断点处会暂停实施。

   三 、当您的先后停掉时,你可以用它来考察爆发了何等事情。

   四 、动态的改观你程序的实践环境,尝试革新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下计划义务找个被一再调用的网页,
里面加上3个检测代码set_time_limit(0);ignore_user_abort(true);死循环第四个法子是最广泛的,
倘诺php服务器上未曾权限去crontab,
也能够找二个和好的机器定期crontab去哀求服务器第2种方法,
论坛上定时清理新帖基本上就是如此落成的, 借使人气不旺的话,
可以考虑去其他火爆点的论坛里面发个图片,
调用自个儿的php来贯彻1个trigger就好了。
Discuz!是判断在00:00从此,第二个执行者去实践的。第叁种相比较不可信赖,
Apache重启了就得重新访问,  fastcgi倒是会好一些。

玩过Linux的人相应都清楚,若是想让二个主次在后台运转,只要在执行命令的末尾加上一个&符号就足以了。不过那种方式不是很有限资助,某个程序当你登出终极后它就会告一段落。那么如何让3个程序真的永远在后台执行呢。答案就是使用
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

下边的那段代码,能够在时下文件夹下,生成1个test.txt,并每隔20秒,往里面写入2个日子戳,无论客户端是还是不是关闭浏览器。

nohup 执行顺序的命令 &

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

透过rpm包情势安装

 
 从

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

<?php
ignore_【美高梅开户网址】php怎么写定时职分,gdb调试技巧。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是很不难的。只要听从以下步骤一步步操作即可。

 
 壹 、但是安装在此以前,必须确保它所依靠的环境没难点。上面是它凭借的借助环境。

   * 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

   肆 、然后2次实行如下命令,以便形成安装

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进度

指令行格式

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

set_time_limit(0),那些函数的法力是,打消php文件的举行时间,若是没有这一个函数的话,暗中认可php的履行时间是30秒,也等于说30秒后,那些文件就say
goodbay了。

 代码如下

   美高梅开户网址 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命令初阶执行脚本。

   第2种方式:

 
 运转后通过file命令内定要调节的次第。当您采用gdb调试完2个程序,想调试此外一个顺序时,就足以不脱离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程序,从而切换了要调节的次序。

大家在做3个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
的命令行方式这一章,发现能化解这一标题,提议大家只要想用那个措施的话先看看这一章。

 代码如下

美高梅开户网址 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)
......

一 、在 Windows 平台下您可以将cli\php.exe 和 .php
文件的双击属性相关联,您也得以编写二个批处理公事来用 PHP
执行脚本。大家把写好的次序放在1个索引下如 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");
......

   钦命方法名查看代码示例:

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 一条语句一条语句的履行。它有3个别名,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中的布置职分中添加1个职分,让操作系统在某些时间来运维那几个批处理公事。

翻看变量

 
 将来您早就会安装断点,查看断点附近的代码,并得以单步执行和继续执行。接下来您可能会想驾驭程序运转的一对动静,如查看变量的值。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” 的款式得以以十六进制方式查看变量值。

② 、即便你使用 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);//等待6分钟}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地图