JavaRush /Java 博客 /Random-ZH /IntelliJ IDEA 和 Debug:不是潜水,而是浮潜
Viacheslav
第 3 级

IntelliJ IDEA 和 Debug:不是潜水,而是浮潜

已在 Random-ZH 群组中发布
编写代码就成功了一半。仍需要使其正常工作。IDE 和调试工具在这方面为我们提供了很多帮助。
IntelliJ IDEA 和调试:不是潜水,而是浮潜 - 1
以 IntelliJ IDEA 为例,我建议熟悉如何了解代码运行时会发生什么情况。调试是一个广泛的主题,因此本评论不提供像潜水员那样的深度潜水。但我肯定希望浮潜)

介绍

编写代码的一部分是调试它。如果您的任务包括代码支持,那么将会有更多的调试。好吧,此外,在调试的帮助下,您可以深入检查所使用的库和框架的工作,就像您可以沉浸在别人的代码丛林中一样。对于我们的潜水,我们需要: 首先,使用快速启动源代码解压下载的存档。启动 IntelliJ Idea 并创建“从现有来源创建新项目”。选择hibernate4子目录中的pom.xml文件。导入时指定“自动导入Maven项目”并完成项目的创建,其他设置不变。导入项目时,将下载的 WildFly 应用程序服务器解压到某个目录中。我们使用该文件(或 *nix 系统的standalone.sh)启动服务器bin\standalone.bat(!)从 --debug 参数开始很重要 。我们等待服务器启动。他们会写信给我们,告诉我们开始时间并注明时间。它看起来像这样:
IntelliJ IDEA 和调试:不是潜水,而是浮潜 - 2
接下来,我们需要在服务器上运行我们选择的项目。这个过程在项目本身的一个小文档中进行了描述: \hibernate4\README.adoc 如本文档所示,我们需要在 hibernate4 目录中运行命令:mvn clean package wildfly:deploy 我们正在等待构建已成功完成的消息:
IntelliJ IDEA 和调试:不是潜水,而是浮潜 - 3
之后,在服务器日志中我们可以看到新项目是如何“部署”的:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 4
之后,我们进入该页面,我们应该显示一个带有“会员注册http://localhost:8080/wildfly-hibernate4”表单的页面。所以,我们的实验准备工作已经完成,我们可以开始了))为了清晰起见,前面会有很多图片,所以做好准备)

远程调试

因此,我们需要配置 Debug 模式,以便我们的 IDE 控制应用服务器上代码的执行。IntelliJ Idea 有两个版本:免费(社区)和付费(终极)。后者可以以EAP的形式正式试用。在 Ultimate 版本中,一切都很简单 - 应用程序服务器可以在调试模式下直接从 IDE 启动。但在社区版本中,您需要手动执行一些操作。因此,让我们考虑一个更复杂的情况,即 社区版本中的设置。社区版本有一些限制。特别是,您无法从中运行应用程序服务器。但是您可以设置远程调试(远程调试),当单独的某个地方有一个正在运行的服务器以及我们需要的应用程序时。让我们使用此处的设置描述:IntelliJ Idea 社区版中的远程调试 Wildfly(为端口 8787 设置远程运行配置)。配置完成后,我们在调试模式下启动新配置:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 5
如果一切顺利,我们将在下面看到一条相关消息:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 6

调试过程

让我们调试保存记录。为此,我们必须首先决定我们要探索的地方。从窗口来看,我们需要一个“注册”按钮。让我们在代码中找到它。所以,我们需要一个元素,它应该有文本:“Register”。或者她应该与这件事有关。单击Ctrl+Shift+F并在引号中查找“注册”。我们看到index.xhtml上有一个。
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 7
按 Enter 键转到找到的源:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 8
所以,我们看到注册时,调用了memberController.register , 显然,这一定是某种java类。点击Ctrl+N并搜索:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 9
确实有这样一个类。让我们来看看吧。显然,应该有一个注册方法。点击 Ctrl+F12查找注册方法
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 10
确实,我们找到了。显然,注册发生在memberRegistration.register中。按住 Ctrl 键并单击该方法即可“落入”其中:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 11
现在让我们设置一个“断点”或断点。这是一个标记,告诉代码执行应该在哪里暂停。这一刻我们将有机会学到很多有趣的东西。要放置它,您需要单击行号右侧的位置。
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 12
在 http://localhost:8080/wildfly-hibernate4 页面上填写字段并单击注册按钮。面板上的idea图标会闪烁:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 13
进入Idea,可以看到调试面板中有很多有趣的信息:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 14
在这里您可以看到对象字段的值。例如,注册会员包括哪些内容:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 15
伟大的。我们还能做什么?我们可以打开上下文菜单并选择“评估表达式”(或通过菜单“运行”->“评估表达式”)。更好的是,在调试器控制面板上:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 16
这是断点处的一个超级酷的能力,可以访问该代码点有权访问的所有内容,执行可以在该点执行的任何代码。例如:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 17
调试器控制面板上还有控制按钮,负责将程序流控制移至何处。是不是很神奇?)通过按 F8(Step Out)按钮,我们可以在不输入方法的情况下浏览代码。通过按 F9,我们停止使用调试器遍历代码行,并让调试器控制程序的进度。如果我们按 F7(单步执行),那么我们将浏览代码,输入一路上遇到的每个方法。对了,特别注意这个信息块:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 18
这显示了我们所在的线程以及当前线程堆栈上的方法。但这还不是全部。为了方便起见,您可以打开框架选项卡。为此,必须启用它:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 19
现在,在框架选项卡上,我们可以看到有关从方法到方法的转换的信息,因为 开始使用 Step Into 遍历代码。
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 20
正如我们所看到的,我们不能总是转移到程序当前正在执行的位置。我们现在位于“getDelegate:469,AbstractEntityManager(org.jboss.as.jpa.container)”。但事实上,我们正在执行中。这可以通过以下指定的类来证明:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 21
让我们看看这个。我们知道,它指向当前对象。我们在 TransactionScopedEntityManager。为什么 Idea 不能向我们展示代码?事实上,IntelliJ Idea 目前不知道任何 TransactionScopedEntityManager,因为 它没有连接到我们的项目(它不在项目依赖项中)。当应用程序服务器运行时,其中运行着很多很多不同的库。但我们对他们知之甚少,因为…… 一般来说,我们不需要深入研究内部结构,我们只需要它能够工作即可。但有时工作或运动兴趣需要它。然后,您需要告知Idea有关该库的信息,以便它知道从哪里获取类代码。

连接第三方库进行调试

首先,我们自己需要了解需要连接的是什么类型的库。 第一种方法是最困难的——在网上搜索。找到结果的速度和结果很大程度上取决于项目的管理情况。例如,WildFly 有一个开放的存储库。因此,当我们谷歌“TransactionScopedEntityManager”时,我们将访问https://github.com/wildfly/wildfly/tree/master/jpa/subsystem,并发现我们需要wildfly-jpa。 第二种方法是正确的。服务器在哪里,看看那里。有多种方法可以帮助解决这个问题。例如,在 Windows 上,它可能是Far Manager。以下是搜索算法的示例。安装并启动它后,使用Tab 键切换到其中一个选项卡,使用Alt+F1左侧选项卡或Alt+F2右侧选项卡,然后选择我们在硬盘上所需的分区。安装后,Far Manager 目录本身很可能在 Far Manager 中打开。要转至磁盘根目录,请按Ctrl + \。使用时,Alt+F打开搜索窗口,开始输入目录名称,找到目录后按 Enter。这个搜索很聪明,并突出显示那些与搜索文本匹配的目录。如果输入的字符没有文件夹,则无法输入此类字符。这样我们就进入了应用服务器目录。假设我们不知道模块位于服务器上的位置。也许这是您一生中第一次听说某种野蝇。因此,请立即单击此处Alt+F7搜索文件。因此,逻辑表明:我们需要一个包含库的文件。也就是说,我们需要一个罐子。里面应该有一个TransactionScopedEntityManager类。因为 class = file,然后查找“contains”。也就是说,像这样:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 22
现在,让我们等待结果。他不会让你久等)
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 23
现在,我们需要在某处找到它的源代码。并且有 2 个选项: 也许我们可以使用第二个。我们去那里找一下:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 24
现在让我们继续描述依赖性。在此页面上您可以下载源代码。太好了,现在我们已经下载了代码。剩下的就是连接库了。连接起来极其简单。我们需要打开项目设置:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 25
在那里,我们选择“Libraries”并将收到的源代码添加到“Sources”部分,在“Classes”部分中,我们指示我们使用 Far Manager 找到的 WildFly 目录中的库 jar 文件本身。之后,当我们通过 F7 导航时,我们将看到 AbstractEntityManager 和 TransactionScopedEntityManager 类的内容,并且还可以通过使用 Ctrl+N 按类搜索来获取。

有条件的断点

现在让我们回到断点。有时候,我们并不总是想停下来,但只是在某些情况下才想停下来。该怎么办?在这里我们的 IDE 也会帮助我们。通过放置断点,我们可以为其指定一个条件。例如,放置一个点并右键单击它:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 26
现在,只有当名称为 Maximilian 时,断点才会触发。通过单击“更多”按钮,您将可以使用一组扩展的断点设置。

异常断点

有时我们可能会收到错误,我们想追踪它的来源。然后我们可以不在特定的代码行添加断点,而是在抛出异常的地方添加断点。为此,您需要展开所有断点的列表:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 27
并为选定的异常类型创建新规则:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 28
例如,对于 NPE:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 29

热插拔类

调试器是一个了不起的东西。除了调试之外,它还允许您更改类!是的,资源(例如 xhtml 页面)不能那么容易更改。但是java类的代码可以即时替换(这称为热交换)。为此,只需更改附加了调试器的类并执行“运行”->“重新加载更改的类”。关于此主题的有用评论:在 JVM 上热交换代码的 4 种免费方法

结论

调试器是一个功能强大的工具,它允许开发人员深入执行代码的最深处并研究它的每一个细节。这使您可以纠正最令人困惑的错误。它还可以让您更好地了解某些库的工作原理。即使这样一个简短的评论也令人印象深刻,但我希望它有用且有趣。如果有人对此材料感兴趣,您可以使用以下链接继续深入:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 30
#维亚切斯拉夫
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION