教你如何使用gdb调试php!

本文给大家介绍关于如何使用gdb调试php(gdb 是c语言的代码调试工具,可以用来调试php、python、mysql等),希望对需要的朋友有所帮助!

本文给大家介绍关于如何使用gdb调试php(gdb 是c语言的代码调试工具,可以用来调试php、python、mysql等),希望对需要的朋友有所帮助!

使用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!

php零基础到就业直播视频课:进入学习API 文档、设计、调试、自动化测试一体化协作工具:点击使用

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 focusbreak

  • 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-fpm3.追踪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_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.`5.请求测试文件

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

[root@test ~]# curl localhost/3.php6.查看调试信息

通过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;);

推荐学习:《PHP视频教程》

php怎么调试sql语句错误

原创2021-07-12 10:17:241455 + php学习QQ群(点击入群)

php调试sql语句错误的方法:1、通过die语句调试PHP SQL错误;2、通过“mysql_error”语句调试PHP SQL错误。

教你如何使用gdb调试php!

千万级数据并发如何处理?进入学习

本文操作环境:windows7系统、PHP7.1版,DELL G3电脑

php怎么调试sql语句错误?

通过die和mysql_error语句调试PHP SQL错误

一、代码

<!–处理文件代码–>
<?php
$conn=mysql_connect('localhost','root','root') or die("与服务器连接失败!");
mysql_select_db('db_database22',$conn) or die("没有找到数据库!");
if($_POST[Submit]=="提交"){
$admin=$_POST[admin];//获取提交的用户名
$pass=$_POST[pass];//获取提交的密码
$dates=date("Y-m-d H:i:s");//定义当前时间
$query="insert into user (admin,password,dates) values('$admin','$pass','$dates')";//编写添加语句
$result=mysql_query($query,$conn) or die(mysql_error()); //执行添加语句,并返回错误信息
if($result){
echo "<script>alert('添加成功!'); window.location.href='index.php';</script>";
}else{
echo "添加失败!!";
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>SQL语句错误</title>
</head>
<style type="text/css">
<!–
.STYLE1 {color: #FF0000}
–>
</style>
<body>
<!–表单提交页,设置的表单元素–>
<form name="form1" method="post" action="index.php">
<table width="240" border="1" cellpadding="1" cellspacing="1" bordercolor="#FFFFFF" bgcolor="#FF0000">
<tr>
<td width="80" align="right" bgcolor="#FFFFFF"><span class="STYLE1">管理员:</span></td>
<td width="147" bgcolor="#FFFFFF"><input name="admin" type="text" id="admin" size="20"></td>
</tr>
<tr>
<td align="right" bgcolor="#FFFFFF"><span class="STYLE1">密码:</span></td>
<td bgcolor="#FFFFFF"><input name="pass" type="password" id="pass" size="20"></td>
</tr>
<tr>
<td colspan="2" align="center" bgcolor="#FFFFFF"><input type="submit" name="Submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>

二、运行结果

Unknown column 'password' in 'field list'

以上就是php怎么调试sql语句错误的详细内容,更多请关注钦钦技术栈其它相关文章!

转载至:php中文网【www.php.cn】

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/25206/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年9月23日 下午1:06
下一篇 2022年9月23日 下午1:06
软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!