!!!

一、Debug作用

Debug的作用大致如下:追踪代码的运行流程程序运行异常定位和调试。对于一个优秀的测试人员来说,需要具备的能力:能发现问题,还能定位问题,而且能给研发解释得清楚
测试人员在测试过程中,在有一定定位问题能力前提下,尽量不要一发现问题就找开发,可以先通过各种手段定位出问题。如果实在找不出原因,可以再去找开发。定位问题的手段有很多,例如看日志、抓包、Debug等

二、Debug基本使用

在IDEA中使用Debug步骤分为设置断点和调试程序两部。如下图所示
在这里插入图片描述

2.1 开启或取消断点

  • 在IDEA中左侧行号栏鼠标左键单击即可打上/取消断点。在设置好断点后,断点出鼠标右键单击可以通过取消勾选Enabled选项可以使之不生效。
    在这里插入图片描述
  • 鼠标左键单击可以开启和取消断点,如果需要取消所有断点,可以先点击进入Breakpoints面板中。
    在这里插入图片描述
  • 可以取消勾选断点,就可以使之失效,点击上方 — 号就可以删除断点。
    在这里插入图片描述

2.2 设置断点范围

  • 设置断点的时候,按照断点的影响范围,可以分为ALLThreadALL:阻塞所有线程。Thread:阻塞当前线程。一般需要进行多线程的Debug或者Debug远程代码的时候,都是选择Thread模式
    在这里插入图片描述

  • 关于Debug中ALL和Thread的不同,可以通过下面的代码进行区分。在ThreadTester类的run方法的两条输出语句中打上断点,分别设置ALL、Thread两种情况,查看执行步骤。最后可以看出:使用All的模式,所有进入代码的线程,都会依次卡在第一个断点上,如果不放行,任意一个线程都不进入到下一步。如果是Thread的模式,那么就会每个线程进行依次进行调试,依次进入各自的断点中。

    public class ThreadDebugTest {
        public static void main(String[] args) {
            Thread t1=new ThreadTester("Thread-1");
            t1.start();
    
        <span class="token class-name">Thread</span> t2<span class="token operator">&#61;</span><span class="token keyword">new</span> <span class="token class-name">ThreadTester</span><span class="token punctuation">(</span><span class="token string">&#34;Thread-2&#34;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        t2<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    
        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">&#34;All Thread a&#61;end&#34;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    }

    class ThreadTester extends Thread{
    public ThreadTester(String name){
    this.setName(name);
    }

    <span class="token annotation punctuation">&#64;Override</span>
    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">&#43;</span><span class="token string">&#34; start&#34;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">&#43;</span><span class="token string">&#34; end&#34;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    }

2.3 设置断点条件

  • 按照命中次数:即可以设置在某行语句执行到第几次的时候,触发断点。
    在这里插入图片描述
    在这里插入图片描述
  • 按照表达式:在断点处设置表达式,当表达式成立的时候,触发Debug。
    在这里插入图片描述
    在这里插入图片描述

2.4 设置断点类型

  • 行断点:上面在制定代码行设置断点的,都是行断点。
    在这里插入图片描述
  • 方法断点:标记在方法那一行的断点。对于方法断点,可以设置下面几个值:Method entry:进入方法时激活断点。Method exit:结束方法时激活断点。Emulated:方法开始和结束都都触发一次断点,默认也是这个。
    在这里插入图片描述
    在这里插入图片描述
  • 异常断点:当程序发生指定的异常,触发断点。创建和触发异常断点的步骤如下。这种断点对于知道代码中某个场景会抛出异常,但是却不明确哪一块代码导致抛出异常的场景下,还是很好用的。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 变量断点:设置在变量上的断点。应用场景:在进行一系列的计算后,变量的值不是预期效果的情况下,可以使用变量断点来确定原因。
    在这里插入图片描述
    在这里插入图片描述
  • 类断点:设置在类上的断点,比较少用。

三、多线程Debug

在前面说到设置断点的范围的时候,说到了ALL和Thread,而多线程Debug就是设置为Thread情况下得调试。

在这里插入图片描述
在这里插入图片描述

四、远程Debug

4.1 开启远程Debug

参考链接:Java项目开启远程调试(tomcat、springboot)
作为测试而言,可以参考上面链接在Java应用启动时添加相关配置,设置Debug也端口。如果已经设置Debug端口的可以通过使用ps -ef|grep java查看应用是否开启Debug,以及其对应的Debug端口

在这里插入图片描述

添加的配置有两种模式,一种为-agentlib,另一种为-Xdebug,其区别和用法参数含义如下。

  • -agentlib:用于java5以上。-Xdebug会以解释模式而不是JIT运行,这会比较慢,所以推荐-agentlib

    -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y
    
  • -Xdebug:通常用于java5 及更低版本

    -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044
    

参数解析:

参数含义
addressdebug端口
server=y/nJVM 是否需要作为调试服务器执行
suspend=y/n是否在调试客户端建立连接之后启动JVM
transport=dt_socket、dt_shmemdt_socket使用socket模式,dt_shmem使用共享内存,后者只适用于windows平台

4.2 IDEA中进行远程Debug

  • 点击Run -> Edit Configurations
    在这里插入图片描述
  • 点击+ -> Remote
    在这里插入图片描述
  • 填写IP地址端口号,然后启用即可。
    在这里插入图片描述
  • 点击开启Debug,显示如下即代表连接上远程Debug。
    在这里插入图片描述

!!!

版权声明:本文为CSDN博主「One Tester」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37688023/article/details/116403767

最后修改:2021 年 08 月 11 日
如果觉得我的文章对你有用,请随意赞赏