使用GDB调试PHP代码,解决PHP代码死循环问题

来源:脚本之家  责任编辑:小易  

看到这句话很感慨,“远三白、近三黑”是我的老师李瑞芬教授在三四十年前说过的,包括“四条腿的不如两条腿的、两条腿不如一条腿的,一条腿不如没有腿的”,这些浅显易懂的理论虽然不能太绝对,但对于多数人来说真的很有指导意义。(在此给老师三鞠躬了)1??“远三白”的意思是远离白糖、白盐、白脂油。白糖是精制糖、除了碳水化合物之外没有别的营养素,是最没有价值的糖类,其营养还不如蜂蜜和炼乳。白盐则是精制盐,其中含大量的氯化钠,对于高血压等心血管疾病的人来说,尤其应该注意。过多摄入盐,会更容易诱发胃癌。白脂油是猪油,猪油本无罪,炒菜时温度稍微高点也不容易氧化。只是我们现在肉类食物摄入过多,包括五花肉、排骨、肥牛、

最近在帮同事解决Swoole Server问题时,发现有1个worker进程一直处于R的状态,而且CPU耗时非常高。初步断定是PHP代码中发生死循环。

  劳力士和Comex合作后,手表的数据必然收到Comex公司的影响,大家都知道水鬼的防水深度为300米,而鬼王的防水深度已经可以达到1220米,鬼王Ref.1166600更是达到了3900米。相比较而言水鬼更是一种时尚的产品,而鬼王才是劳力士真正朝实用发展的产品。  作为一款超高防水深度的腕表,后盖的密封性尤为重要,后盖采用5级钛合金金属,保障潜水性能。后盖锯齿角度小,锯齿深,据说做成这样的效果很费刀具。  拱形的蓝宝石镜面厚度可达5mm,侧面可以看到一层一层的鱼眼效果,更通透。表壳侧面一样精心打磨,展现出高水准的制表工艺。侧面设有阀门,可自动排氦。当手表内的气压超过3至5巴,阀门便会开启并

下面通过一段代码展示如何解决PHP死循环问题。

11几点优势的客观总结:1、屏幕质量与其他同水平智能旗舰手机比,应该是业界超一流水平,与三星、苹果不相上下。2、后置摄像头素质从目前看,应该在国内手机品牌中无人可敌的,看参数跟S8系列同级配置;但在国际DXOMark评级中获得目前手机最高分90分,比三星GalaxyS8的88分还高出一截。这一成绩应该相当有份量。3、手机音质应该是最佳水平,某些参数已经超越三星S8系列,包括外放和耳机推力。而且3D降噪对应的黑科技,智能主动降噪技术是亮点。4、机身的双面玻璃+金属边框定位中性,审美超前,前面板的玻璃也进行了四曲面3D处理。这也让HTCU11成为继荣耀Magic之后,又一款“八曲面”玻璃手机。符合

复制代码 代码如下:

你穷的只看见了钱原创乱而且乱弹2017-08-3015:19国际大导演诺兰来华为新片《敦克尔克》造势,有关方面安排《战狼2》导演吴京与之进行一场“颠峰对谈”,没想到引发了一场粉丝骂战。两厢对决,如果在天平的一端放上诺兰曾创作出的《致命魔术》、《星际穿越》、《蝙蝠侠之黑暗骑士》等影史经典作品,那另一端恐怕只能放上吴京刚刚凭借《战狼2》狂赚的54亿票房了。没错,吴京赚了54亿,但“影帝”?如果票房可以决定影帝影后,那还评什么奥斯卡、金棕榈啊!想起那年“双十一”,淘宝销售额首创新高,马云一夜之间成为全民膜拜的偶像,网上刷屏马云语录、马云“惊人论点”,甚至大量“马云背后的女人”“没有她就没有今天的马云

#dead_loop.php

$array = array();

for($i = 0; $i < 10000; $i++)

{

    $array[] = $i;

}

include __DIR__."/include.php";

#include.php

while(1)

{

    usleep(10);

    $keys = array_flip($array);

    $index = array_search(rand(1500, 9999), $array);

    $str = str_repeat('A', $index);

    $strb = test($index, $str);

}

function test($index, $str)

{

    return str_replace('A', 'B', $str);

}

通过ps aux得到进程ID和状态如下,使用gdb -p 进程ptrace跟踪,通过bt命令得到调用栈

复制代码 代码如下:

你穷的只看见了钱原创乱而且乱弹2017-08-3015:19国际大导演诺兰来华为新片《敦克尔克》造势,有关方面安排《战狼2》导演吴京与之进行一场“颠峰对谈”,没想到引发了一场粉丝骂战。两厢对决,如果在天平的一端放上诺兰曾创作出的《致命魔术》、《星际穿越》、《蝙蝠侠之黑暗骑士》等影史经典作品,那另一端恐怕只能放上吴京刚刚凭借《战狼2》狂赚的54亿票房了。没错,吴京赚了54亿,但“影帝”?如果票房可以决定影帝影后,那还评什么奥斯卡、金棕榈啊!想起那年“双十一”,淘宝销售额首创新高,马云一夜之间成为全民膜拜的偶像,网上刷屏马云语录、马云“惊人论点”,甚至大量“马云背后的女人”“没有她就没有今天的马云

htf 3834 2.6 0.2 166676 22060 pts/12 R+ 10:50 0:12 php dead_loop.php

gdb -p 3834

(gdb) bt

#0 0x00000000008cc03f in zend_mm_check_ptr (heap=0x1eaa2c0, ptr=0x2584910, silent=1, __zend_filename=0xee3d40 "/home/htf/workspace/php-5.4.27/Zend/zend_variables.c",

__zend_lineno=182, __zend_orig_filename=0xee1888 "/home/htf/workspace/php-5.4.27/Zend/zend_execute_API.c", __zend_orig_lineno=437)

at /home/htf/workspace/php-5.4.27/Zend/zend_alloc.c:1485

#1 0x00000000008cd643 in _zend_mm_free_int (heap=0x1eaa2c0, p=0x2584910, __zend_filename=0xee3d40 "/home/htf/workspace/php-5.4.27/Zend/zend_variables.c", __zend_lineno=182,

__zend_orig_filename=0xee1888 "/home/htf/workspace/php-5.4.27/Zend/zend_execute_API.c", __zend_orig_lineno=437) at /home/htf/workspace/php-5.4.27/Zend/zend_alloc.c:2064

#2 0x00000000008cebf7 in _efree (ptr=0x2584910, __zend_filename=0xee3d40 "/home/htf/workspace/php-5.4.27/Zend/zend_variables.c", __zend_lineno=182,

__zend_orig_filename=0xee1888 "/home/htf/workspace/php-5.4.27/Zend/zend_execute_API.c", __zend_orig_lineno=437) at /home/htf/workspace/php-5.4.27/Zend/zend_alloc.c:2436

#3 0x00000000008eda0a in _zval_ptr_dtor (zval_ptr=0x25849a0, __zend_filename=0xee3d40 "/home/htf/workspace/php-5.4.27/Zend/zend_variables.c", __zend_lineno=182)

at /home/htf/workspace/php-5.4.27/Zend/zend_execute_API.c:437

#4 0x00000000008fe687 in _zval_ptr_dtor_wrapper (zval_ptr=0x25849a0) at /home/htf/workspace/php-5.4.27/Zend/zend_variables.c:182

#5 0x000000000091259f in zend_hash_destroy (ht=0x7f7263f6e380) at /home/htf/workspace/php-5.4.27/Zend/zend_hash.c:560

#6 0x00000000008fe2c5 in _zval_dtor_func (zvalue=0x7f726426fe50, __zend_filename=0xeea290 "/home/htf/workspace/php-5.4.27/Zend/zend_execute.c", __zend_lineno=901)

at /home/htf/workspace/php-5.4.27/Zend/zend_variables.c:45

#7 0x0000000000936656 in _zval_dtor (zvalue=0x7f726426fe50, __zend_filename=0xeea290 "/home/htf/workspace/php-5.4.27/Zend/zend_execute.c", __zend_lineno=901)

at /home/htf/workspace/php-5.4.27/Zend/zend_variables.h:35

#8 0x0000000000939747 in zend_assign_to_variable (variable_ptr_ptr=0x7f7263f8e738, value=0x7f726426f6a8) at /home/htf/workspace/php-5.4.27/Zend/zend_execute.c:901

#9 0x0000000000997ee5 in ZEND_ASSIGN_SPEC_CV_VAR_HANDLER (execute_data=0x7f726d04b2a8) at /home/htf/workspace/php-5.4.27/Zend/zend_vm_execute.h:33168

#10 0x000000000093b5fd in execute (op_array=0x21d58b0) at /home/htf/workspace/php-5.4.27/Zend/zend_vm_execute.h:410

#11 0x0000000000901692 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /home/htf/workspace/php-5.4.27/Zend/zend.c:1315

#12 0x000000000087926a in php_execute_script (primary_file=0x7ffffe0038d0) at /home/htf/workspace/php-5.4.27/main/main.c:2502

#13 0x00000000009a32e3 in do_cli (argc=2, argv=0x7ffffe004d18) at /home/htf/workspace/php-5.4.27/sapi/cli/php_cli.c:989

#14 0x00000000009a4491 in main (argc=2, argv=0x7ffffe004d18) at /home/htf/workspace/php-5.4.27/sapi/cli/php_cli.c:1365

执行gdb后,死循环的进程会变成T的状态,表示正在Trace。这个是独占的,所以不能再使用strace/gdb或者其他ptrace工具对此进程进行调试。另外此进程会中断执行。gdb输入c后,程序继续向下运行。然后再次按下ctrl + c中断程序。 通过bt命令查看进程的调用栈。

复制代码 代码如下:

你穷的只看见了钱原创乱而且乱弹2017-08-3015:19国际大导演诺兰来华为新片《敦克尔克》造势,有关方面安排《战狼2》导演吴京与之进行一场“颠峰对谈”,没想到引发了一场粉丝骂战。两厢对决,如果在天平的一端放上诺兰曾创作出的《致命魔术》、《星际穿越》、《蝙蝠侠之黑暗骑士》等影史经典作品,那另一端恐怕只能放上吴京刚刚凭借《战狼2》狂赚的54亿票房了。没错,吴京赚了54亿,但“影帝”?如果票房可以决定影帝影后,那还评什么奥斯卡、金棕榈啊!想起那年“双十一”,淘宝销售额首创新高,马云一夜之间成为全民膜拜的偶像,网上刷屏马云语录、马云“惊人论点”,甚至大量“马云背后的女人”“没有她就没有今天的马云

(gdb) bt

#0 _zend_mm_alloc_int (heap=0x1eaa2c0, size=72, __zend_filename=0xe43410 "/home/htf/workspace/php-5.4.27/ext/standard/array.c", __zend_lineno=2719,

__zend_orig_filename=0xee5a38 "/home/htf/workspace/php-5.4.27/Zend/zend_hash.c", __zend_orig_lineno=412) at /home/htf/workspace/php-5.4.27/Zend/zend_alloc.c:1895

#1 0x00000000008ceb86 in _emalloc (size=72, __zend_filename=0xe43410 "/home/htf/workspace/php-5.4.27/ext/standard/array.c", __zend_lineno=2719,

__zend_orig_filename=0xee5a38 "/home/htf/workspace/php-5.4.27/Zend/zend_hash.c", __zend_orig_lineno=412) at /home/htf/workspace/php-5.4.27/Zend/zend_alloc.c:2425

#2 0x0000000000911d85 in _zend_hash_index_update_or_next_insert (ht=0x2257a10, h=3972, pData=0x7ffffe0012b0, nDataSize=8, pDest=0x0, flag=1,

__zend_filename=0xe43410 "/home/htf/workspace/php-5.4.27/ext/standard/array.c", __zend_lineno=2719) at /home/htf/workspace/php-5.4.27/Zend/zend_hash.c:412

#3 0x00000000007767e1 in zif_array_flip (ht=1, return_value=0x7f726424ea68, return_value_ptr=0x0, this_ptr=0x0, return_value_used=1)

at /home/htf/workspace/php-5.4.27/ext/standard/array.c:2719

#4 0x000000000093c03e in zend_do_fcall_common_helper_SPEC (execute_data=0x7f726d04b2a8) at /home/htf/workspace/php-5.4.27/Zend/zend_vm_execute.h:643

#5 0x00000000009400e6 in ZEND_DO_FCALL_SPEC_CONST_HANDLER (execute_data=0x7f726d04b2a8) at /home/htf/workspace/php-5.4.27/Zend/zend_vm_execute.h:2233

#6 0x000000000093b5fd in execute (op_array=0x21d58b0) at /home/htf/workspace/php-5.4.27/Zend/zend_vm_execute.h:410

两次的BT信息不一样,这是因为程序在不同的位置中断。看到execute (oparray=0x21d58b0) 这一行,这里就是PHP执行oparray的入口了。gdb下输入f 6,(通过调用栈编号可得)。

复制代码 代码如下:

你穷的只看见了钱原创乱而且乱弹2017-08-3015:19国际大导演诺兰来华为新片《敦克尔克》造势,有关方面安排《战狼2》导演吴京与之进行一场“颠峰对谈”,没想到引发了一场粉丝骂战。两厢对决,如果在天平的一端放上诺兰曾创作出的《致命魔术》、《星际穿越》、《蝙蝠侠之黑暗骑士》等影史经典作品,那另一端恐怕只能放上吴京刚刚凭借《战狼2》狂赚的54亿票房了。没错,吴京赚了54亿,但“影帝”?如果票房可以决定影帝影后,那还评什么奥斯卡、金棕榈啊!想起那年“双十一”,淘宝销售额首创新高,马云一夜之间成为全民膜拜的偶像,网上刷屏马云语录、马云“惊人论点”,甚至大量“马云背后的女人”“没有她就没有今天的马云

(gdb) f 6

#6 0x000000000093b5fd in execute (op_array=0x21d58b0) at /home/htf/workspace/php-5.4.27/Zend/zend_vm_execute.h:410

410 if ((ret = OPLINE->handler(execute_data TSRMLS_CC)) > 0) {

(gdb) p *op_array

$2 = {type = 2 '\002', function_name = 0x7f726d086540 "test", scope = 0x0, fn_flags = 134217728, prototype = 0x0, num_args = 2, required_num_args = 2, arg_info = 0x7f726d086bd8,

refcount = 0x7f726d0870f0, opcodes = 0x7f726424d600, last = 8, vars = 0x7f726424e890, last_var = 2, T = 1, brk_cont_array = 0x0, last_brk_cont = 0, try_catch_array = 0x0,

last_try_catch = 0, static_variables = 0x0, this_var = 4294967295, filename = 0x7f726424ba38 "/home/htf/wwwroot/include.php", line_start = 12, line_end = 15, doc_comment = 0x0,

doc_comment_len = 0, early_binding = 4294967295, literals = 0x7f726424eae0, last_literal = 4, run_time_cache = 0x7f726450bfb0, last_cache_slot = 1, reserved = {0x0, 0x0, 0x0, 0x0}}

这里的filename就能看到op_array是哪个PHP文件的。然后输入f 0进入当前位置。

复制代码 代码如下:

你穷的只看见了钱原创乱而且乱弹2017-08-3015:19国际大导演诺兰来华为新片《敦克尔克》造势,有关方面安排《战狼2》导演吴京与之进行一场“颠峰对谈”,没想到引发了一场粉丝骂战。两厢对决,如果在天平的一端放上诺兰曾创作出的《致命魔术》、《星际穿越》、《蝙蝠侠之黑暗骑士》等影史经典作品,那另一端恐怕只能放上吴京刚刚凭借《战狼2》狂赚的54亿票房了。没错,吴京赚了54亿,但“影帝”?如果票房可以决定影帝影后,那还评什么奥斯卡、金棕榈啊!想起那年“双十一”,淘宝销售额首创新高,马云一夜之间成为全民膜拜的偶像,网上刷屏马云语录、马云“惊人论点”,甚至大量“马云背后的女人”“没有她就没有今天的马云

(gdb) p **executor_globals.opline_ptr

$4 = {handler = 0x93ff9c , op1 = {constant = 1680133296, var = 1680133296, num = 1680133296, hash = 140129283132592, opline_num = 1680133296,

jmp_addr = 0x7f726424ccb0, zv = 0x7f726424ccb0, literal = 0x7f726424ccb0, ptr = 0x7f726424ccb0}, op2 = {constant = 0, var = 0, num = 0, hash = 0, opline_num = 0, jmp_addr = 0x0,

zv = 0x0, literal = 0x0, ptr = 0x0}, result = {constant = 32, var = 32, num = 32, hash = 32, opline_num = 32, jmp_addr = 0x20, zv = 0x20, literal = 0x20, ptr = 0x20},

extended_value = 1, lineno = 5, opcode = 60 '

这里的lineno表示OPCODE所在的代码行数,可以到对应文件里去看下是哪行代码。使用GDB可以查看到更多的信息,这里就不再一一介绍了,有兴趣各位可以自行尝试。

zbacktrace的使用

zend官方提供了一个gdb的脚本,对指令进行了封装,可以直接看到php函数的调用关系。在php源代码包的根目录中有一个.gdbinit。使用

复制代码 代码如下:

你穷的只看见了钱原创乱而且乱弹2017-08-3015:19国际大导演诺兰来华为新片《敦克尔克》造势,有关方面安排《战狼2》导演吴京与之进行一场“颠峰对谈”,没想到引发了一场粉丝骂战。两厢对决,如果在天平的一端放上诺兰曾创作出的《致命魔术》、《星际穿越》、《蝙蝠侠之黑暗骑士》等影史经典作品,那另一端恐怕只能放上吴京刚刚凭借《战狼2》狂赚的54亿票房了。没错,吴京赚了54亿,但“影帝”?如果票房可以决定影帝影后,那还评什么奥斯卡、金棕榈啊!想起那年“双十一”,淘宝销售额首创新高,马云一夜之间成为全民膜拜的偶像,网上刷屏马云语录、马云“惊人论点”,甚至大量“马云背后的女人”“没有她就没有今天的马云

source your_php_src_path/.gdbinit

zbacktrace

可以直接看到PHP函数的调用堆栈。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

linux想用 gdb调试php 学习php源码

您好您可以使用YUM服务器再次安装一下。最好用-e先卸载掉。再进行安装。

如何使用GDB调试PHP程序

首先在cmd中

把根路径跳到你java文件的磁盘下。

javac 文件名.java

java 文件名

如何 gdb 调试php-fpm

  1,安装strace

  [html] view plain copy

  sudo apt-get install strace

2,查看php-fpm进程

  [html] view plain copy

  vagrant@vagrant-ubuntu-precise-64:~$ ps -ef | grep php-fpm

  root 2105 1 0 04:02 ? 00:00:02 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)

  www-data 2113 2105 0 04:02 ? 00:00:02 php-fpm: pool www

  www-data 18481 2105 0 07:05 ? 00:00:01 php-fpm: pool www

  www-data 18513 2105 0 07:06 ? 00:00:03 php-fpm: pool www

  vagrant 19312 6379 0 10:14 pts/4 00:00:00 grep --color=auto php-fpm

3,调试进程输出日志到文件

  [html] view plain copy

  vagrant@vagrant-ubuntu-precise-64:~$ sudo strace -f -p 2105 -e trace=file -o /temp/trace.log

  Process 2105 attached - interrupt to quit

  Process 19349 attached

  Process 19350 attached

4,查看日志文件

  [html] view plain copy

  tail -f /temp/trace.log

开发php内核扩展如何使用GDB来调试 - PHP内核源码分析

这个问题曾在我去某公司面试时被提起过,可惜考官问的是php的BUG调试方法,后来居然说的就是Core dump,当时我就想这和PHP一点毛关系都没有,开启Core dump几乎是所有C/C++开发必备的,只是常态,可能是他们的PHP扩展用得太多了,也从侧面说明了php的扩展比起其它语言来要麻烦许多。

  • 本文相关:
  • 如何使用firefox插件firephp调试php
  • firephp 推荐一款php调试工具
  • windows和linux中php代码调试工具xdebug的安装与配置详解
  • php学习笔记 (1) 环境配置与代码调试
  • php中调试函数debug_backtrace的使用示例代码
  • php使用debug_backtrace方法跟踪调试代码调用详解
  • phpstorm配置xdebug进行调试php教程
  • php 调试工具debug tools
  • 最常用的8款php调试工具
  • php代码调试利器firephp安装与使用方法分析
  • php goto语句用法实例
  • php正则匹配中英文、数字及下划线的方法【用户名验证】
  • 解析php5配置使用pdo
  • 两种php去除二维数组的重复项方法
  • 如何让thinkphp在模型中自动完成session赋值小教程
  • php利用二叉堆实现topk-算法的方法详解
  • php通用防注入程序 推荐
  • php pdo实现的事务回滚示例
  • php连接sqlserver2005 的问题解决方法
  • 原生php实现导出csv格式excel文件的方法示例【附源码下载】
  • linux想用 gdb调试php 学习php源码
  • 如何使用GDB调试PHP程序
  • 如何 gdb 调试php-fpm
  • 开发php内核扩展如何使用GDB来调试 - PHP内核源码分析
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved