专栏首页方亮跨平台PHP调试器设计及使用方法——使用

跨平台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 shown
		echo '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按钮。此时会新打开一个页面发送请求,然后我们的调试器中断后会在变量区域显示新的请求参数

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 跨平台PHP调试器设计及使用方法——协议解析

            在《跨平台PHP调试器设计及使用方法——探索和设计》一文中,我介绍了将使用pydbgp作为和Xdebug的通信库,并让pydbgp以(孙)子进程...

    方亮
  • libev源码解析——调度策略

            在《libev源码解析——监视器(watcher)结构和组织形式》中介绍过,监视器分为[2,-2]区间5个等级的优先级。等级为2的监视器最高优,...

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

            之前七篇博文讲解了跨平台PHP调试器从立项到实现的整个过程,并讲解了其使用方法。但是它们并不能全部涵盖所有重要内容,所以新开一片博文,用来讲述其...

    方亮
  • [Android Studio 权威教程]断点调试和高级调试

    好了开始写一个简单的调试程序,我们先来一个for循环 for (int i = 0; i < 10; i++) {//获取当前i的值 int select...

    非著名程序员
  • 谷歌断点调试(转载)

    简单地说,断点调试是指自己在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,...

    lin_zone
  • 逆向二期/002/OD知识

    在command插件输入:?MessageBoxA 会在后面出现地址,转到就可以了

    yichen
  • VisualStudio 断点调试详解

    本文详细告诉大家 VisualStudio 断点调试的功能和使用方法,本文使用的是最新 VisualStudio2019 的功能,也许在你看到这篇博客的时候这个...

    林德熙
  • Visual Studio 调试系列3 断点

    断点是开发人员的工具箱中最重要的调试技术之一。 若要暂停调试程序执行所需的位置设置断点。 例如,你可能想要查看代码变量的状态或查看调用堆栈的某些断点。

    张传宁老师
  • 熟练使用IDEA的断点调试(Breakpoint),大大提升你调试代码的效率(行断点、属性断点、异常断点、条件断点、远程debug...)【享学Java】

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    BAT的乌托邦
  • GDB调试指南-断点设置

    在介绍之前,我们首先需要了解,为什么需要设置断点。我们在指定位置设置断点之后,程序运行到该位置将会“暂停”,这个时候我们就可以对程序进行更多的操作,比如查看变量...

    编程珠玑

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动