怎么使用gdb調(diào)試php

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

十載的措勤網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整措勤建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“措勤網(wǎng)站設(shè)計”,“措勤網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。

簡介

gdb 是c語言的代碼調(diào)試工具
可以用來調(diào)試php、python、MySQL等

調(diào)試主要有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 ...]

常用調(diào)試命令

attach pid

例:如果向跟蹤調(diào)試mysql代碼
1.先找到mysql進(jìn)行ID:10111
怎么使用gdb調(diào)試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 執(zhí)行到num個斷點,num可以不填默認(rèn)=1

next [num]

  • n num 執(zhí)行到下num行,num可以不填默認(rèn)=1,不進(jìn)入函數(shù)內(nèi)部

step [num]

  • s num 執(zhí)行到下num行,num可以不填默認(rèn)=1,不進(jìn)入函數(shù)內(nèi)部

backtrace

  • bt 查看當(dāng)前調(diào)用棧

print [value]

  • p value 打印變量信息

help

  • help layout 查看命令如何使用

調(diào)試php代碼

1. 新增一個php文件

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

2.查看php-fpm work進(jìn)程PID

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

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源碼,看你需要在哪里調(diào)試代碼

(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.請求測試文件

請求之后發(fā)現(xiàn)沒有立刻看到返回結(jié)果,被阻塞在了這里,說明執(zhí)行到了斷點的地方

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

6.查看調(diào)試信息

通過p *time可以看到變量time里面的內(nèi)容

(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;
}

總結(jié)

通過gdb追蹤很方便我們debug代碼信息,查看底層代碼跳用棧,對學(xué)習(xí)源碼有很大的幫助
這里也總結(jié)下php strtotime方法的實現(xiàn)邏輯
如果當(dāng)前年>=1970,則循環(huán)判斷[1970-(當(dāng)前年-1)]中每一年是否是閏年,是閏年則86400366,不是則86400355  (86400是一天的秒數(shù)),月天時分秒計算邏輯不再累述,最后還會加上/減去時區(qū),上海是東八區(qū)會減去8小時。
東八區(qū)(UTC/GMT+08:00)是比世界協(xié)調(diào)時間(UTC)/格林尼治時間(GMT)快8小時的時區(qū),
附php代碼實現(xiàn)年轉(zhuǎn)化成時間戳
<?php

const YEARLEEP = 366;//閏年366天
const YEAR     = 365;//平年365天

//判斷是否是閏年
function is_leap($year)
{
    return ($year % 4 == 0) && ($year % 100 != 0 || $year % 400 == 0);
}

//將年轉(zhuǎn)換成時間戳
function getStime($year)
{
    $res = 0;
    for ($i = $year - 1; $i >= 1970; $i--) {
        if (is_leap($i)) {
            $res += YEARLEEP * 86400;
        } else {
            $res += YEAR * 86400;
        }
    }
    //上海是東八區(qū)要減8小時
    $res -= 8 * 3600;
    return $res;
}

echo getStime('2020');

以上就是怎么使用gdb調(diào)試php的全部內(nèi)容了,更多與怎么使用gdb調(diào)試php相關(guān)的內(nèi)容可以搜索創(chuàng)新互聯(lián)之前的文章或者瀏覽下面的文章進(jìn)行學(xué)習(xí)哈!相信小編會給大家增添更多知識,希望大家能夠支持一下創(chuàng)新互聯(lián)!

網(wǎng)頁標(biāo)題:怎么使用gdb調(diào)試php
文章出自:http://muchs.cn/article28/iehpcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計網(wǎng)站策劃、用戶體驗、動態(tài)網(wǎng)站、建站公司、網(wǎng)站維護

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司