广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >怎么使用gdb调试php
  • 253
分享到

怎么使用gdb调试php

2023-06-29 00:06:13 253人浏览 安东尼
摘要

今天给大家介绍一下怎么使用gdb调试PHP。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。使用gdb调试php简介gdb 是C语言的代码调试工具可以用来调试ph

今天给大家介绍一下怎么使用gdb调试PHP。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。

简介

gdb 是C语言的代码调试工具
可以用来调试phppythonmysql

调试主要有4种形式

gdb:启动之后用attach pid 追踪程序gdb [options] [executable-file [core-file or process-id]]gdb [options] --args executable-file [inferior-arguments ...]gdb [options] [--Python|-P] script-file [script-arguments ...]

常用调试命令

attach pid

例:如果向跟踪调试mysql代码
1.先找到mysql进行ID:10111
怎么使用gdb调试php

2.再attach 10111追踪mysql

layout

显示源码/汇编指令

Layout names are:   src      : Displays source and command windows. 显示源码   asm      : Displays disassembly    and command windows. 显示汇编指令   split : Displays source, disassembly    and command windows. 显示源码和汇编指令   regs     : Displays reGISter window. If    existing layout              is source/command or    assembly/command, the               register window is displayed. If the              source/assembly/command (split) is displayed,               the register    window is displayed with               the window that has current logical focus

break

  • b 增加断点

  • info b 显示断点信息

  • delete num 删除指定断点

continue [num]

  • c num 执行到num个断点,num可以不填默认=1

next [num]

  • n num 执行到下num行,num可以不填默认=1,不进入函数内部

step [num]

  • s num 执行到下num行,num可以不填默认=1,不进入函数内部

backtrace

  • bt 查看当前调用栈

print [value]

  • p value 打印变量信息

help

  • help layout 查看命令如何使用

调试php代码

1. 新增一个php文件

<?phpecho date('Y-m-d', strtotime("last day of +2month", strtotime('2020-05-31')));

2.查看php-fpm work进程PID

我这里通过修改php-fpm配置只启动一个work进程方便追踪

pm = staticpm.max_children = 1
[root@test ~]# ps aux|grep php-fpmwww        1127  0.0  0.1 279352  2816 ?        S    5月12   0:00 php-fpm: pool wwwroot      12224  0.0  0.0 112736   976 pts/0    S+   17:37   0:00 grep --color=auto php-fpm

3.追踪PID

[root@test ~]# gdbGNU gdb (GDB) Red Hat Enterprise linux 7.6.1-115.el7Copyright (C) 2013 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later <Http://gnu.org/licenses/gpl.html>This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.  Type "show copying"and "show warranty" for details.This GDB was configured as "x86_64-redhat-linux-gnu".For bug reporting instructions, please see:<http://www.gnu.org/software/gdb/bugs/>.(gdb) attach 1127Attaching to process 1127Reading symbols from /usr/local/php/sbin/php-fpm...done.Reading symbols from /usr/lib64/libcrypt.so.1...Reading symbols from /usr/lib/debug/usr/lib64/libcrypt-2.17.so.debug...done.done.

4.打断点,这里在timelib_update_tsdo_years方法打了一个断点,这里需要你看下php源码,看你需要在哪里调试代码

(gdb) b timelib_update_tsBreakpoint 1 at 0x48ba90: file /opt/lnmp1.6/src/php-7.3.11/ext/date/lib/tm2unixtime.c, line 499.
(gdb) b do_years`Breakpoint 3 at 0x48bb95: file /opt/lnmp1.6/src/php-7.3.11/ext/date/lib/tm2unixtime.c, line 381.`

5.请求测试文件

请求之后发现没有立刻看到返回结果,被阻塞在了这里,说明执行到了断点的地方

[root@test ~]# curl localhost/3.php

6.查看调试信息

通过p *time可以看到变量time里面的内容

(gdb) cContinuing.Breakpoint 1, timelib_update_ts (time=time@entry=0x7fc63ec02000, tzi=tzi@entry=0x7fc63ec75000) at /opt/lnmp1.6/src/php-7.3.11/ext/date/lib/tm2unixtime.c:499499    {(gdb) cContinuing.Breakpoint 3, timelib_update_ts (time=time@entry=0x7fc63ec02000, tzi=tzi@entry=0x7fc63ec75000) at /opt/lnmp1.6/src/php-7.3.11/ext/date/lib/tm2unixtime.c:505505        res += do_years(time->y);(gdb) sdo_years (year=2020) at /opt/lnmp1.6/src/php-7.3.11/ext/date/lib/tm2unixtime.c:381381        eras = (year - 1970) / 40000;(gdb) stimelib_update_ts (time=time@entry=0x7fc63ec02000, tzi=tzi@entry=0x7fc63ec75000) at /opt/lnmp1.6/src/php-7.3.11/ext/date/lib/tm2unixtime.c:504504        do_adjust_special(time);(gdb) p *time$1 = {y = 2020, m = 7, d = 31, h = 0, i = 0, s = 0, us = 0, z = 28800, tz_abbr = 0x7fc63ec71018 "CST", tz_info = 0x7fc63ec75000, dst = 0, relative = {y = 0, m = 2,     d = 0, h = 0, i = 0, s = 0, us = 0, weekday = 0, weekday_behavior = 0, first_last_day_of = 2, invert = 0,     days = -99999, special = {type = 0, amount = 0},     have_weekday_relative = 0, have_special_relative = 0}, sse = 0, have_time = 0, have_date = 0, have_zone = 0,     have_relative = 1, have_weeknr_day = 0,   sse_uptodate = 0, tim_uptodate = 0, is_localtime = 1, zone_type = 3}(gdb)

下面是do_years方法的代码

static timelib_sll do_years(timelib_sll year){    timelib_sll i;    timelib_sll res = 0;    timelib_sll eras;    eras = (year - 1970) / 40000;    if (eras != 0) {        year = year - (eras * 40000);        res += (SECS_PER_ERA * eras * 100);    }        if (year >= 1970) {        for (i = year - 1; i >= 1970; i--) {            //判断是否是闰年,闰年366天,平年365天            if (timelib_is_leap(i)) {                res += (DAYS_PER_LYEAR * SECS_PER_DAY);            } else {                res += (DAYS_PER_YEAR * SECS_PER_DAY);            }        }    } else {        for (i = 1969; i >= year; i--) {            if (timelib_is_leap(i)) {                res -= (DAYS_PER_LYEAR * SECS_PER_DAY);            } else {                res -= (DAYS_PER_YEAR * SECS_PER_DAY);            }        }    }    return res;}

总结

通过gdb追踪很方便我们debug代码信息,查看底层代码跳用栈,对学习源码有很大的帮助
这里也总结下php strtotime方法的实现逻辑
如果当前年>=1970,则循环判断[1970-(当前年-1)]中每一年是否是闰年,是闰年则86400366,不是则86400355  (86400是一天的秒数),月天时分秒计算逻辑不再累述,最后还会加上/减去时区,上海是东八区会减去8小时。
东八区(UTC/GMT+08:00)是比世界协调时间(UTC)/格林尼治时间(GMT)快8小时的时区,
附php代码实现年转化成时间戳
<?phpconst YEARLEEP = 366;//闰年366天const YEAR     = 365;//平年365天//判断是否是闰年function is_leap($year){    return ($year % 4 == 0) && ($year % 100 != 0 || $year % 400 == 0);}//将年转换成时间戳function getStime($year){    $res = 0;    for ($i = $year - 1; $i >= 1970; $i--) {        if (is_leap($i)) {            $res += YEARLEEP * 86400;        } else {            $res += YEAR * 86400;        }    }    //上海是东八区要减8小时    $res -= 8 * 3600;    return $res;}echo getStime('2020');

以上就是怎么使用gdb调试php的全部内容了,更多与怎么使用gdb调试php相关的内容可以搜索编程网之前的文章或者浏览下面的文章进行学习哈!相信小编会给大家增添更多知识,希望大家能够支持一下编程网!

--结束END--

本文标题: 怎么使用gdb调试php

本文链接: https://www.lsjlt.com/news/321492.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么使用gdb调试php
    今天给大家介绍一下怎么使用gdb调试php。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。使用gdb调试php简介gdb 是c语言的代码调试工具可以用来调试ph...
    99+
    2023-06-29
  • linux中怎么使用gdb调试程序
    在Linux中使用gdb调试程序,可以按照以下步骤进行操作:1. 在命令行中编译你的程序时,加上`-g`选项,以便生成调试信息。例如...
    99+
    2023-09-13
    linux
  • PHP如何用gdb调试源码
    这篇文章主要介绍了PHP如何用gdb调试源码的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PHP如何用gdb调试源码文章都会有所收获,下面我们一起来看看吧。php编译时有一个debug模式,这个模式会关闭内存优...
    99+
    2023-07-04
  • Linux下怎么使用gdb调试go程序
    在golang的开发过程中,我们常常会遇到需要调试问题的情况。这时,我们需要工具来辅助我们进行调试。在golang中,最常用的调试工具就是gdb了。本文将介绍如何在Linux操作系统下安装和配置gdb。一、什么是gdb?gdb是一款可以在多...
    99+
    2023-05-14
  • Linux程序调试工具gdb怎么使用
    这篇文章主要介绍“Linux程序调试工具gdb怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux程序调试工具gdb怎么使用”文章能帮助大家解决问题。gdb是GNU开源组织发布的一个强大...
    99+
    2023-06-27
  • C编译: 使用gdb调试
    介绍gdb调试命令行使用gdb是the GNU Debugger的简称。它是一款UNIX平台的调试器(debugger),可用于为C, C++, Objective-C, Java, Fortran等程序debug。在gdb中,你可以通过设...
    99+
    2023-06-03
  • 在Linux中怎么使用gdb调试C程序
    这篇文章主要为大家展示了“在Linux中怎么使用gdb调试C程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“在Linux中怎么使用gdb调试C程序”这篇文章吧。无论多么有经验的程序员,开发的任...
    99+
    2023-06-16
  • 深入了解PHP:用gdb调试源码
    本篇文章给大家带来了关于PHP的相关知识,其中主要介绍了关于使用gdb调试源码的相关内容,下面一起来看一下,希望对大家有帮助。php编译时有一个debug模式,这个模式会关闭内存优化,提示内存泄露,屏蔽调用栈优化可以让我们看到完整的php ...
    99+
    2023-05-14
    php
  • 【Linux】调试器 gdb 及 ‘\r‘ 的使用
    目录 前言 gdb 断点 打断点 查看、删除断点 断点使能 调试 显示数据 其他指令 ‘\r’的使用 行缓冲区 小程序 前言 🥑在 Linux 下我们可以通过 gcc 进行编译,但与 vs 相比若想对代码进行调试,...
    99+
    2023-09-05
    linux 运维 服务器
  • Linux如何使用gdb调试多进程
    这篇文章主要介绍了Linux如何使用gdb调试多进程的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux如何使用gdb调试多进程文章都会有所收获,下面我们一起来看看吧。一.gdb常用目录表操作描述l命令相当...
    99+
    2023-06-28
  • Linux系统中gdb程序调试工具怎么用
    这篇文章主要为大家展示了“Linux系统中gdb程序调试工具怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux系统中gdb程序调试工具怎么用”这篇文章吧。  一、常规调试  gdb是...
    99+
    2023-06-13
  • Linux下如何使用gdb调试core文件
    1.core文件 当程序运行过程中出现Segmentation fault (core dumped)错误时,程序停止运行,并产生core文件。core文件是程序运行状态的内存映象。使用gdb调试core文件,可以帮...
    99+
    2022-06-03
    Linux gdb Linux gdb调试文件 Linux gdb调试core文件
  • vscode中怎么远程gdb调试?方法详解
    vscode中怎么远程gdb调试?下面本篇文章给大家介绍一下vscode远程gdb调试的方法,希望对大家有所帮助!最近在同事的安利下,尝试了用 vscode 做 gdb 调试,用完之后,“真香”。话不多说,本文要实现的是:在 windows...
    99+
    2023-10-22
    vscode调试
  • Linux系统下如何使用GDB调试程序
    本文将为大家详细介绍“Linux系统下如何使用GDB调试程序”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“Linux系统下如何使用GDB调试程序”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容...
    99+
    2023-06-28
  • 详解Linux下调试器GDB的基本使用方法
    目录一、概述二、gdb调试2.1、设置断点2.1.1、断点commands高级功能2.2、运行2.3、显示栈帧2.4、显示变量2.5、显示寄存器2.6、单步执行2.7、继续执行2.8、监视点2.9、改变变量的值2.1...
    99+
    2022-06-03
    Linux 调试器 GDB 调试器
  • 在Centos7中使用vscode和gdb调试PG插件的方法
    目录安装vscodevscode中gdb调试调试动态库调试程序识别需要attach的PG进程安装vscode sudo rpm --import https://packages.m...
    99+
    2022-11-13
  • 在Linux系统中使用GDB来调试C++程序的方法
    这篇文章主要讲解了“在Linux系统中使用GDB来调试C++程序的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Linux系统中使用GDB来调试C++程序的方法”吧!安装GDB大多数的...
    99+
    2023-06-13
  • Linux gdb命令怎么使用
    这篇文章主要介绍“Linux gdb命令怎么使用”,在日常操作中,相信很多人在Linux gdb命令怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux gdb命令怎么使用”的疑惑有所帮助!接下来...
    99+
    2023-06-28
  • 『Linux从入门到精通』第 ⑪ 期 - Linux调试器——gdb使用详解
    文章目录 💐专栏导读💐文章导读🌷准备工作🌷安装gdb调试器🌷如何进入调试?🌷调试相关指令 💐专栏导读 &#x...
    99+
    2023-08-18
    linux 运维 服务器
  • Linux的gdb命令怎么使用
    这篇“Linux的gdb命令怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux的gdb命令怎么使用”文章吧。L...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作