菜单

GDB调试教程

2019年2月3日 - 金沙编程资讯
php test.php

经过rpm包方式安装

 
 从

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

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

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

图片 1

启动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
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();}

玩过Linux的人应有都知晓,若是想让一个程序在后台运行,只要在执行命令的末梢加上一个&符号就可以了。可是那种措施不是很保障,有些程序当您登出极端后它就会终止。那么怎么着让一个先后真的永远在后台执行呢。答案就是拔取nohub 命令,格式为:

gdb -p 56571

继续执行

 
 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    {
......

三、解决措施:

在Linux下要让一个脚本挂在后台执行可以在指令的末尾加上一个 “&”
符号,有时候那还不够,须要依赖nohup命令,关于nohup,

   图片 2

安装

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

1
#gdb -help

 
 即使已经设置了gdb,那么将会来得它能利用的具有参数。纵然没有安装,大家得以经过以下三种艺术来安装。

下一场写一个windows批处理公事内容如下。

在Web环境下,执行php脚本都是Web服务器开启的cgi进度来处理,只要脚本不脱离,就会直接占有该cgi进度,当启动的持有cgi进程都被占用完后就无法在拍卖新的伸手。所以对那多少个可能会很讨厌的脚本,可以选拔异步的法子。启动子脚本的办法和CLI差不离,必要求使用&和点名输出(只好是定向到/dev/null),可是不可能使用nohup。例如:

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

收获辅助音讯

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

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

 

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

按照文件名和行号指定断点

 

 
 如若您的顺序是用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
的命令行方式这一章,发现能解决这一标题,提议大家只要想用那么些艺术的话先看看这一章。

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

相关文章

发表评论

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

网站地图xml地图