91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用gdb調試php

發布時間:2022-01-26 16:34:56 來源:億速云 閱讀:165 作者:柒染 欄目:編程語言

今天給大家介紹一下怎么使用gdb調試php。文章的內容小編覺得不錯,現在給大家分享一下,覺得有需要的朋友可以了解一下,希望對大家有所幫助,下面跟著小編的思路一起來閱讀吧。

簡介

gdb 是c語言的代碼調試工具
可以用來調試php、python、mysql

調試主要有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文件

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

2.查看php-fpm work進程PID

我這里通過修改php-fpm配置只啟動一個work進程方便追蹤

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

3.追蹤PID

[root@test ~]# gdb
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-115.el7
Copyright (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 1127
Attaching to process 1127
Reading 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_ts
Breakpoint 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) c
Continuing.

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:499
499    {
(gdb) c
Continuing.

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:505
505        res += do_years(time->y);
(gdb) s
do_years (year=2020) at /opt/lnmp1.6/src/php-7.3.11/ext/date/lib/tm2unixtime.c:381
381        eras = (year - 1970) / 40000;
(gdb) s
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:504
504        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代碼實現年轉化成時間戳
<?php

const 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相關的內容可以搜索億速云之前的文章或者瀏覽下面的文章進行學習哈!相信小編會給大家增添更多知識,希望大家能夠支持一下億速云!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

卢氏县| 上犹县| 五常市| 读书| 同德县| 凯里市| 闽清县| 建昌县| 纳雍县| 凤城市| 大渡口区| 阿拉善右旗| 林周县| 塘沽区| 泰安市| 越西县| 永平县| 邢台市| 乡宁县| 咸宁市| 万盛区| 华蓥市| 尉犁县| 子洲县| 资源县| 新余市| 东丽区| 顺平县| 佛冈县| 土默特左旗| 乌拉特中旗| 武义县| 和政县| 惠水县| 虎林市| 晋城| 松原市| 襄垣县| 保靖县| 东明县| 紫云|