您好,登錄后才能下訂單哦!
今天給大家介紹一下怎么使用gdb調試php。文章的內容小編覺得不錯,現在給大家分享一下,覺得有需要的朋友可以了解一下,希望對大家有所幫助,下面跟著小編的思路一起來閱讀吧。
gdb 是c語言的代碼調試工具
可以用來調試php、python、mysql等
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 ...]
例:如果向跟蹤調試mysql代碼
1.先找到mysql進行ID:10111
2.再attach 10111追蹤mysql
顯示源碼/匯編指令
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
b 增加斷點
info b 顯示斷點信息
delete num 刪除指定斷點
c num 執行到num個斷點,num可以不填默認=1
n num 執行到下num行,num可以不填默認=1,不進入函數內部
s num 執行到下num行,num可以不填默認=1,不進入函數內部
bt 查看當前調用棧
p value 打印變量信息
help layout 查看命令如何使用
<?php echo date('Y-m-d', strtotime("last day of +2month", strtotime('2020-05-31')));
我這里通過修改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
[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.
timelib_update_ts
和do_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.`
請求之后發現沒有立刻看到返回結果,被阻塞在了這里,說明執行到了斷點的地方
[root@test ~]# curl localhost/3.php
通過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相關的內容可以搜索億速云之前的文章或者瀏覽下面的文章進行學習哈!相信小編會給大家增添更多知識,希望大家能夠支持一下億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。