当前位置: 首页 > 编程日记 > 正文

跨平台PHP调试器设计及使用方法——使用

经过之前六篇博文的分析和介绍,大家应该对这套调试器有个初步的认识。本文我将讲解它的使用方法。(转载请指明出于breaksoftware的csdn博客)

上图是该软件界面的布局,我们之后的讲解也将围绕着这些功能展开。

文件夹管理

在查看一个功能代码前,我们往往需要知道其逻辑所在的路径。文件夹管理功能就是提供给用户设置代码逻辑路径的地方。用户可以在这个功能里管理需要调试的代码工程路径。

新增目录

点击文件夹区域第二个按钮,弹出一个对话框,我们可以在输入框中输入一个目录,然后点击Save。这样新目录就加进来了。

删除目录

首先选择一个根文件夹,然后点击文件夹区域第三个按钮,这样就在调试器中删除了该目录的查看。

这块的逻辑见phpdebugserver.py的request_files_tree函数。ide_config.py文件是实现路径增删读的实现模块,它直接操作的是ide.cfg文件中folders区域。

查看代码

作为一个可视化的调试器,查看被调试源码是基础功能。我们可以通过单击文件夹管理区域中文件名来展现文件内容。

调试开关

调试开关是一个非常必要的设置。我们在一台机器上搭建了调试服务后,并不是每次请求都是要调试的。在需要调试的时候,我们可以开启这个开关。这个时候调试器的状态机根据是否设置了断点来决定调试的方式。

如果设置了断点,则进入调试状态后一直运行,直到遇到断点而中断。比如我们在2,3,4行设置了断点,启动调试后,程序会中断在第3行

如果没有断点,则中断到第一行代码。

当调试开关关闭时,调试功能键全部没禁用。

反之则全部被启用。

调用堆栈

调用堆栈可以帮助我们回溯函数的调用过程。比如某一个函数在代码中多个地方被调用,而本次调试时它的内部正好出错,可能是入参错误,这个时候我就需要回溯下调用堆栈,看看哪个地方调用此函数出错的。下图是我们调用到checkNum函数时的调用堆栈信息,它显示在综合信息区域

变量

变量查看是我们在调试过程中经常使用到的功能。当我们逻辑中断在某一行代码时,我们可以通过综合信息区域的变量窗口查看相关变量。默认的,我只是显示了当前堆栈上的变量和全局变量,比如下面一段逻辑

dd();function checkNum($number)
{if($number>1){throw new Exception("Value must be 1 or below");}return true;
}function dd() {try{checkNum(2);//If the exception is thrown, this text will not be shownecho 'If you see this, the number is 1 or below';}catch(Exception $e){echo 'Message: ' .$e->getMessage();}
}

当我们调用到异常抛出行时,我们此时的堆栈上只有一个临时变量

但是此时,该函数外层还有两个调用堆栈,而这两个调用堆栈(见“调用堆栈”节中的图)上的参数是默认不显示的。因为它的数据量可能比较大,而且可能没太多必要,所以我默认把它关闭了。当然我也提供的开启全栈数据的开关。用户可以在Tools的Setting中开启All Stack Parameters功能

断点

断点也是调试器非常基础的功能,我支持了除了watch类型之外的所有其他断点形式。

行断点

新增行断点有三种方式。一种是在代码区域的行号上点击一下

还有一种方式是在综合功能区域Breakpoint的Tab中点击“新增断点”按钮

还有一种是在行号上右击,然后选择“Add Line Breakpoint”。该操作还是会弹出上面这个窗口设置断点信息。

我们可以通过综合信息区域的Breakpoint页面查看断点信息

删除断点操作也非常简单。我们可以在已设置断点的行号上点击一下,或者在综合信息区域的Breakpoint页对断点执行delete操作。

函数调用断点

当我们需要调试某函数时,我们可以设置函数调用断点。这样一旦函数被调用到,就会被中断到函数最开始执行处。我们可以通过新增断点窗口对dd这个函数设置函数调用断点。

我们在第7行调用了dd,最终程序断在dd函数执行的第一行,即21行。

函数返回断点

顾名思义,函数返回断点是断在指定函数的返回处。我们还以dd这个函数为例。

当这个断点被命中后,此时调试器尚不处在代码中,我们可通过调用堆栈看到

此时,我们需要执行一下step over让调试器进入代码中。从下图可见,绿标的那行就是执行完dd函数后应该要被执行的代码。

异常断点

异常断点是用于帮助我们在异常发生前中断的断点。比如我们程序中使用异常方式终止流程执行,则可能在代码很多地方遍布异常抛出逻辑。而本次调试时最终在何处抛出异常,则比较难以定位。这个时候异常断点就是一个非常好的方案。我们以抛出Exception类型异常为例,首先我们要在断点设置窗口中设置断点信息

然后触发调试,可以发现流程中断在抛出异常的地方。此时我们便可以分析上下文和变量信息查看异常的原因。

条件断点

条件断点也是可以帮我们解决繁琐问题的一个方案。比如我们在一个循环中调用一个函数,我们希望这个函数在循环中被调用67次时被中断。那么如果我们在函数上下断点,则可能之前66次中断是没用的,还要不停的在中断后点击Run。这个过程实在太繁琐。条件断点就可以帮我们解决这个问题。我们只要在中断所在行设置条件,比如设置迭代索引为67时中断。下面例子我们以迭代索引为6为例

触发调试后,我们可以发现中断在第32行。而且通过变量查看器,我们可以发现此时$i的值为6。

变量修改

变量修改功能是调试时人为修改变量值从而影响逻辑执行流程的功能。比如上例介绍异常断点时,我们判断$number是否大于1,如果大于则抛出异常。如果我们在调试时不想此时抛出异常,则可以修改$number的值。首先我们在第11行下断点,并触发调试。我们查看下此时变量的值

我们右击变量查看器中$number的值,弹出下面的窗口

我们修改$number的值为1

点击保存,我们在查看变量查看器,并执行一次step over。可以看到$number已经变成1,而且之后也没走抛出异常的逻辑。

变量前后对比功能

这个功能也是默认关闭的。因为它需要保存中断前后两步的全栈变量,这个操作非常耗时。我们可以通过Tools的Setting中的Variables Watch开关开启此功能。我们还需要开启All Stack Parameters功能。

我们在第4行下断点,同时将$a添加到变量监控中

点击综合信息区的Variables Watch页,并触发调试,此时$a在调试前后都没值

执行一次step over操作,让第4行被执行

此时$a被修改为123了。左侧区域是第4行被执行之前的值,右侧是第4行被执行之后的值。我们继续step over两次。看看之后的变化

文件监控功能

当我们调试一个功能时,可能还需要查看一些文件变化,比如我们可能需要监控一些日志文件。此时我们可以使用综合信息区的Files Watch功能。

该文件会随着我们调试进行而变化,我们在该Tab页下也将看到文件变化的过程(手工点击刷新,也可以做成自动)。

请求记录和发送

这个功能是为了记录调试时请求并模拟该请求而设计的。当我们从网页中触发一些请求前,我们可能需要填写一些数据。一次调试后,这些数据将不在页面中存在,而需要重新填写并提交,这个过程非常麻烦。我们可以在调试过程中记录请求内容,并制定请求路径,从而达到记录功能。

比如我们发送http://127.0.0.1/index.php?pamra1=value1&param2=value2请求,我们在变量查看器中可以看到

我们点击请求记录按钮,并该该请求命名

在主界面右侧的变量记录区域我们可以看到它的信息。点击笔状编辑按钮,我们将Url路径和发送方式填入

点击保存即可。我们还可以对变量进行增删改,比如我们增加一个变量param3=value3,则

我们让此次调试结束。然后再次打开上面请求编辑界面,点击Send按钮。此时会新打开一个页面发送请求,然后我们的调试器中断后会在变量区域显示新的请求参数

相关文章:

管理7k+工作流,月运行超10000万次,Lyft开源的Flyte平台意味着什么?

作者 | Allyson Gale译者 | 刘畅编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导读】Flyte 平台可以更容易的创建并发,可伸缩和可维护的工作流,从而进行机器学习和数据处理。Flyte 已有三年多的训练模型和数据处理经…

Jmeter组件执行顺序与作用域

一、Jmeter重要组件: 1)配置元件---Config Element:  用于初始化默认值和变量,以便后续采样器使用。配置元件大其作用域的初始阶段处理,配置元件仅对其所在的测试树分支有效,如,在同一个作用域…

跨平台PHP调试器设计及使用方法——拾遗

之前七篇博文讲解了跨平台PHP调试器从立项到实现的整个过程,并讲解了其使用方法。但是它们并不能全部涵盖所有重要内容,所以新开一片博文,用来讲述其中一些杂项。(转载请指明出于breaksoftware的csdn博客) 触发调试的…

召唤超参调优开源新神器:集XGBoost、TensorFlow、PyTorch、MXNet等十大模块于一身...

整理 | 凯隐编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导读】Optuna是一款为机器学习任务设计的自动超参数优化软件框架,是一款按运行定义(define-by-run) 原则设计的优化软件,允许用户动态地调整搜索空间&#…

Linux下的Silverlight:Moonlight 1.0 Beta 1发布了

Moonlight是微软Silverlight的一个开源实现,其目标平台是Linux与Unix/X11系统。自从2007年9月开始,Moonlight就在Mono项目下进行了开发,它是由Novell发起并资助的。现在,Moonlight 1.0 Beta 1已经向公众发布了。 Novell和Mono宣布…

在visual studio 2010中调用ffmpeg

转自:http://blog.sina.com.cn/s/blog_4178f4bf01018wqh.html 最近几天一直在折腾ffmpeg,在网上也查了许多资料,费了不少劲,现在在这里和大家分享一下。 一、准备工作本来是想自己在windows下编译ffmpeg生成lib、dll等库文件的&am…

无线路由器与无线AP的区别

摆脱线缆的羁绊,手捧一杯香醇的咖啡在家中的任何角落都可以无拘无束和网友谈天说地──这就是无线的魅力!在无线网络迅猛发展的今天,无线局域网(Wireless Local-Area Network,简称WLAN)已经成为许多SOHO家庭…

Simple Dynamic Strings(SDS)源码解析和使用说明一

SDS是Redis源码中一个独立的字符串管理库。它是由Redis作者Antirez设计和维护的。一开始,SDS只是Antirez为日常开发而实现的一套字符串库,它被使用在Redis、Disque和Hiredis等作者维护的项目中。但是作者觉得这块功能还是比较独立的,应该让其…

“不会Linux,到底有多危险?”骨灰级成程序员:基本等于自废武功!

说起程序员的必备技能,我想大家都可以说很多,比如:算法、数据结构、数学、编程语言等等。对于程序员来讲,这些底层能力固然重要,但是,工具同样也是如此,比如常被大家所忽视的:Linux。…

“Uncaught TypeError: string is not a function”

http://www.cnblogs.com/haitao-fan/archive/2013/11/08/3414678.html 今天在js中写了一个方法叫做search(),然后点击按钮的时候提示: “Uncaught TypeError: string is not a function” 百思不得其解啊,我的js木有问题啊啊.... 后来才发现酱…

关于Nikon Ai AF 28mm F1.4D遮光罩的问题

-- 好不容易找到百变妖,确实比较妖!!遮光罩不好找,原厂推荐的HK-7基本属于古董中的古董。 爬文很久,终于找到一篇国外的介绍,说可以用HK-4代替,比HK-7效果更好,而且可以用85mm 1.4D-…

Simple Dynamic Strings(SDS)源码解析和使用说明二

在《Simple Dynamic Strings(SDS)源码解析和使用说明一》文中,我们分析了SDS库中数据的基本结构和创建、释放等方法。本文将介绍其一些其他方法及实现。(转载请指明出于breaksoftware的csdn博客) 字符串连接 SDS库提供下面两种方法进行字符串…

亚马逊机器学习服务:深入研究AWS SageMaker

作者 | Manish Manalath译者 | Shawn编辑 | Carol出品 | AI科技大本营(ID: rgznai100) 机器学习是一个从数据中发现模式的强大概念。但是,如果您尝试过从零开始构建机器模型,那么您一定知道设计一个可扩展的机器学习工作流是多大的…

Java Timer 定时器的使用

一、延时执行首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行。 代码如下:package test;import java.util.Timer;public class TimeTaskTest { public static void main(Str…

Redis源码解析——前言

今天开启Redis源码的阅读之旅。对于一些没有接触过开源代码分析的同学来说,可能这是一件很麻烦的事。但是我总觉得做一件事,不管有多大多难,我们首先要在战略上蔑视它,但是要在战术上重视它。除了一些高大上的技术,我们…

asp.net客户端脚本验证小技巧

通用的客户端脚本验证 Code//验证客户端function checkclient() { var list document.all; for(var i0 ;i<list.length; i) { var h list[i].hint; if(h ! null && h ! "") { if(list[i].isdrop"…

5个可以帮助你提高工作效率的新AI工具

作者 | Kyrylo Lyzanets译者 | 火火酱编辑 | Carol出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 毫无意义的新闻、故事和活动会占用你每天多少的工作时间&#xff1f;假如你是一名需要高绩效的高管或专业人士&#xff0c;如果在工作中可以不分心&#xff0c;那你…

Centos6.5更换163源 epel源

想必大家都遇到过&#xff0c;安装新的centos系统&#xff0c;使用yum去安装软件的时候&#xff0c;要么找不到&#xff0c;要么慢的让人发疯。网上其实办法很多&#xff0c;直接更换163源就ok&#xff0c;但是基本所有的文章都是直接wget下163的源&#xff0c;但是不知道为什么…

图模型+Bert香不香?完全基于注意力机制的图表征学习模型Graph-Bert

作者 | Jiawei Zhang、Haopeng Zhang、Congying Xia、Li Sun译者 | 凯隐编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】本文提出了一种全新的图神经网络 Graph-Bert&#xff0c;仅仅基于 Attention 机制而不依赖任何类卷积或聚合操作…

闭关纪要17.Google app engine的简单应用

在上面用了十一篇博客的文章详细的介绍了&#xff0c;Step1账户登录系统之后&#xff0c;从现在开始&#xff0c;继续写闭关纪要&#xff0c;因为Step1账户登录系统也是闭关工作的一部分&#xff0c;因此保留序号&#xff0c;这篇纪要在上次的闭关纪要5.WML,UTF-8,BOM,签名及其…

Redis源码解析——内存管理

在《Redis源码解析——源码工程结构》一文中&#xff0c;我们介绍了Redis可能会根据环境或用户指定选择不同的内存管理库。在linux系统中&#xff0c;Redis默认使用jemalloc库。当然用户可以指定使用tcmalloc或者libc的原生内存管理库。本文介绍的内容是在这些库的基础上&#…

poj_2479 动态规划

题目大意 给定一列数&#xff0c;从中选择两个不相交的连续子段&#xff0c;求这两个连续子段和的最大值。 题目分析 典型的M子段和的问题&#xff0c;使用动态规划的方法来解决。 f[i][j] 表示将A[1...i] 划分为j个不相交连续子串&#xff0c;且A[j]属于第i个子串&#xff0c;…

Redis源码解析——字典结构

C语言中有标准的字典库&#xff0c;我们可以通过pair(key,value)的形式存储数据。但是C语言中没有这种的库&#xff0c;于是就需要自己实现。本文讲解的就是Redis源码中的字典库的实现方法。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 一般情况下&#xf…

十步,教你把Python运行速度提升 30%

作者 | Martin Heinz译者 | 陆离编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】一直以来&#xff0c;诟病 Python语言的人经常说&#xff0c;他们不想使用的一个原因是 Python 的速度太慢了。不管使用哪一种编程语言&#xff0c;程序…

字符串转换成NSDate类型的 为nil解决方法

方法一 通过下列函数来解决 但是得到的日期会改变 修改方法fix- (NSDate *)timeForString:(NSString *)string {NSMutableString *timeString [[NSMutableString alloc] initWithString:string]; [timeString setString:[timeString stringByReplacingOccurrence…

Redis源码解析——字典基本操作

有了《Redis源码解析——字典结构》的基础&#xff0c;我们便可以对dict的实现进行展开分析。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 创建字典 一般字典创建时&#xff0c;都是没有数据的&#xff0c;但是字典类型需要确定&#xff0c;所以我们看到R…

[转]控制 Cookie 的作用范围

默认时&#xff0c;网站的所有 Cookies 都一起被存储在客户端&#xff0c;并且所有 Cookies 连同网站的任何请求一起被发送到服务器。换句话说&#xff0c;网站中的每个页面都能够为网站获取所有的 Cookies。但是&#xff0c;你能够通过两个方式来设置 Cookies 的作用范围&…

强化学习70年演进:从精确动态规划到基于模型

作者 | Nathan Lambert译者 | 泓礼编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】这是一份帮你了解强化学习算法本质的资源&#xff0c;无需浏览大量文档&#xff0c;没有一条公式&#xff0c;非常适合学生和研究人员阅读。作为强化学习研究人员…

Android ActionBar相关

1.Android 5.0 删除ActionBar下面的阴影 于Android 5.0假设你发现的ActionBar下面出现了阴影&#xff0c;例如&#xff0c;下面的设置&#xff0c;以消除阴影&#xff1a; getActionBar().setElevation(0); Android 5.0之前能够用以下代码消除阴影&#xff1a; <item name&q…

Redis源码解析——字典遍历

之前两篇博文讲解了字典库的基础&#xff0c;本文将讲解其遍历操作。之所以将遍历操作独立成一文来讲&#xff0c;是因为其中的内容和之前的基本操作还是有区别的。特别是高级遍历一节介绍的内容&#xff0c;充满了精妙设计的算法智慧。&#xff08;转载请指明出于breaksoftwar…