虽然我们不喜欢bug,但是bug永远都存在。
虽然我们牛逼,但是仍然有不知道的东西,解决不了的问题。
so,还得借助工具,让咱效率提起来扛扛的。
解决的问题如是:由于某种原因,其他系统发送的mq,我这边说没收到,他那边说发了。然后,一愁不展,咋办呢?好吧,肯定是抓包确认问题咯。嘿,这不是本文的重点,请自行脑补抓包。

从对方系统的mq记录里,取出消息体,放到mq后台,直接发送到消费服务器。模拟发送情况,然后就遇到报错了,苦思不得结果后,只能使用终级绝招,就用本机来代替debug吧。
本地服务起来之后,同样,mq后台发送消息。不出意外地,和测试服务器上报了不一样的错。这就尴尬了。和测试环境不一样,咋整呢?
不怕,咱一步步来。按照堆栈指示的代码行,很快定位了有问题的代码。原因为某个jar包中的值报了空指针异常。咋整呢,咱们的本机环境不像测试环境呢。

解决办法1:将本机模拟成测试环境一样的情况,太难,至少linux和windows环境就是不一样的。

方法2:想办法让这个变量的变得和测试环境一样。也许可行。

方法3:想办法跳过报错的代码,使其继续后面的程序,存在2个问题,1是程序做不到跳过不执行功能,2是跳过执行后后续可能使用这里的值,会导致其他错误。故此,只有改变变量值一法了。

案例1:改变一个基本类型变量的值
直接setvalue即可。

 public static void main(String[] args) {
String var1 = "var1";
int i = 1;
System.out.println("var1:" + var1); // 输出 var1:changed }

案例2:改变一个hashmap变量的值

hashmap是个复杂类型,不能直接设置值。需要使用 add to watches功能。

    public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
int i = 2;
System.out.println("map:" + map); // 输出 map:{name:hello} }

案例3:改变一个实体对象值
可以使用set value 方式直接改变值,也可以使用add to watches操作代码来设置 。 总之你想要都能给你变出来。

    public static void main(String[] args) {
UserInfo info = new UserInfo();
int i = 3;
System.out.println("info:" + info); //输出info:UserInfo{id='123', name='null', sex='null', age=null, address='golden street'}
}

报的错是找不到某个处理方法,但是实际上我自认为已经写了某个方法。那么到底怎么回事呢。
第一次跟踪,到某一行后,退出了程序。debug往下调整。进入方法再进行单步调试。再次发现某一次代码退出。最后定位到反射调用的这一行。原因是之时的入参类型,与现有入参类型不一致。再往前分析,是因为在调用转换器的时候,并没有进行相应的转换,而是以原来的二进制格式返回了。分析程序,知道里面某参数需要包含某值,转换器才会起作用。对症下药,给他这个参数,果然进入到了转换流程。然而,进入后又转换成另一个不可预料的参数了,没办法,getmapper方法不好模拟出来,还是算了,直接模拟转换结果吧,add to watch,改变值。这下,终于进入方法了,代码不再报错。测试通过了。
弄清原理之后,解决就简单了!如果对方没有设置某属性值,让其设置就ok了。如果一定要以某结构参数进行接收处理,那变写一个对应的处理方法即可。小case。

debug,单步调试,进入,退出,计算变量值,推测执行是debug基础,必备。

debug, 让问题变得简单!

java,让debug出色的更多相关文章

  1. 【Java远程debug】

    转自 http://blog.csdn.net/hongchangfirst/article/details/44191925 一.远程debug原理 Java远程调试的原理是两个JVM之间通过deb ...

  2. java的debug和release编译方式

    以前没有注意过,其实Java编译成.class 有两种方式 使用javac,默认使用的release方式,而我们经常使用的MyEclipse工具,用的是debug模式. 区别暂时了解如下: relea ...

  3. java remote debug

    1. java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 -jar test.jar 2.会出现Listening for ...

  4. Java在Debug的时候,有些变量能无限展开(循环了)?

    抛异常的时候,Java Debug 时,有些变量能无限展开,怎么做到的? 先来一个报错的例子: Exception in thread "main" java.lang.Stack ...

  5. java 远程debug

    在启动jar包添加如下参数16091是端口 java -Xdebug -Xrunjdwp:transport=dt_socket,address=16091,server=y,suspend=n -j ...

  6. 【Java】Debug断点调试常用技巧

    Debug操作技巧 Show Execution Point 将光标回到当前断点停顿的地方 Step Over 执行当前行代码,并将运行进度跳转到下一行. Step Into 进入到当前代码行的方法内 ...

  7. Java的Debug调试

    一.在项目上右键,Debug As>Debug on Server 二.在测试类上,Run As>Run On Server

  8. java remote debug parameters

    java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n

  9. java Eclipse debug技巧

    摘要:调试不仅可以查找到应用程序缺陷所在,还可以解决缺陷.对于Java程序员来说,他们不仅要学会如何在Eclipse里面开发像样的程序,更需要学会如何调试程序.本文介绍了Java程序员必知的10个调试 ...

随机推荐

  1. c# maiform父窗体改变动态的gridew 奇偶行变色的快捷方法

    无需在每个usercontrol里边单个指定控件内gridview  隔行换色.只需要在主窗体内改成统一就好了 做到这点要明白.gridcontrol 是usercontrol 的子控件 , grid ...

  2. 关于接口测试工具postman与DHC介绍

    一.Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具.今天给大家介 ...

  3. LaTeX入门

    原写于我的洛谷博客,由于洛谷的\(\mathtt{markdown}\)编辑器和博客园的\(\mathtt{markdown}\)编辑器有点差别,所以实在懒得进行微调,就直接挂一个到洛谷博客的链接好了 ...

  4. Markdown使用小总结[不定时更新]

    title: Markdown使用小总结 date: 2019-03-27 10:09:19 tags: Markdown --- 鸽了这么久,Markdown使用下降,因此写一篇博客来总结一下至今( ...

  5. tomcat修改banner,隐藏版本号

    为了避免黑客针对某些版本进行攻击,因此我们需要隐藏或者伪装 Tomcat 的版本信息.针对该信息的显示是由一个jar包控制的,该jar包存放在 Tomcat 安装目录下的lib目录下,名称为 cata ...

  6. vs2015 不能启动 iis express

    删除以下目录的文件 <<path_to_solution_folder>>\.vs\config\applicationhost.config具体地址http://stacko ...

  7. 微信for linux

    http://blog.csdn.net/sunxiang_520/article/details/51637551

  8. linux下maven的安装

    上传安装包到相应路径 进行解压 tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /export/servers/ 修改环境变量 vim /etc/profile ...

  9. ubuntu18.04修改ssh登录欢迎信息

    1.编辑文件 ll /etc/update-motd.d/* 2.修改文件 3.查询效果 run-parts /etc/update-motd.d

  10. Python的list循环遍历中,删除数据的正确方法

    在遍历list,删除符合条件的数据时,总是报异常,代码如下: num_list = [1, 2, 3, 4, 5] print(num_list) for i in range(len(num_lis ...