粉丝9.6万获赞109.6万

哈喽,分享一下在爱钓中如何去第八个调试我们的加号程序,也就是说这一排按钮的使用。第一个按钮表示可以回到断点处,我这里随便进入某一个地方, 点一下这个按钮,可以看到回到断点处。第二个按钮 staypool 表示一行一行代码去调试,点击一下 staple 音据表示可以进入方法里面点击一下 pose staple 音据强制进入,可以进入原码,比如说这里尺寸有一个判空的方法,我们先点一下这个,走到这一行代码,然后点击一下 佛使 staple 进去,进入圆码中, staple 表示跳出方法,这里点击下做普 frame 回退断点,比如说我这里没调试到,然后点一下这里 可以重新回到这个地方,然后我们再点击下这里进入我们的方法,这里可以重新去调试这个按钮,表示可以让断点移到光标处,比如说我鼠标放在这里,然后点击下 这个按钮,可以看到现在第八个到了这个方面数,然后这个是表达,是计算,在这里我们可以去写一些小的逻辑,然后去运行查看结果。这个按钮是针对于史君们的挑食,我们点击下第一个是历史的中的初始值菲塔过滤判断是否能被二整出, 这里可以看到剩下的是二十六八,然后 max 可以看到在这些偶数中最大值十八,这样的话就能方便我们去查看时间目中每一个步骤的一个结果。然后我们右击下这个断点,可以看到这里有一个表达,是 在这里有一个循环,如果说我们想要 i 等于五的时候才第八个,我们可以在这里写一个 i 等于五的条件,然后我们点击下这个按钮去运行,这里可以看到 i 等于五的时候第八个进来了,这样的话就很方便我们在循环中去第八个指定的条件。以上的这些操作便是爱调中第八个的常用小技巧,你学会了吗?

哈喽,大家好,我是万环的视频,视频,那之前有同学在私信里面说这个 idadbug 很强,但是呢他不知道怎么样去啊使用,然后问我有没有就是, 嗯比较常用的一些,然后非常酷炫的这种第八个的小技巧,可以来一起分享一下啊。今天呢我就给大家来带来这么四个技巧吧,首先是带条件的断点,然后就是断点的这个回退啊, 然后就是咱们比较用的多的就是这个执行表达式,最后就是比如说你不想执行了,然后你直接跳出啊,都是怎么样去做的? ok, 然后首先呢我们这个地方来演示一下这个带条件的断点啊,大家可以看到我们怎么样打这个条件断点呢?首先我们比如说啊,有一个非常大的否循环啊,我们通过其他的这个接口来拿到了一堆 user, 然后呢我们线上有一个问题是某一个 user 的这个 id 他执行起来会有一些问题,然后我们又不想去,呃,花很长时间来循环嘛,对不对?一个一个来定位,所以说我们这个地方就可以来执行一下这个 condition, 就是条件表达式啊,很简单, 首先就是你在这个地方打一个断点,然后你右键鼠标右键啊,然后他就会弹出这样的一个呃,细节的这种第八个设置面板,然后在这个地方他会有一个 condition, 然后他会读取到当前行的一个变量,比如说当前行有一个 user 的变量,对吧?你就可以这样来做啊,如果说这个 user id 不等于空,并且这个 user 点 get id 等等于十一,哎,我们就让他挺住, ok, 然后我们这个地方是有一个测试数据啊,就是他会有两条数据返回,一个是十,一个是十一,对吧? ok, 所以说我们 在运行的时候呢,理论上应该是只有十一 id 为十一的时候,他才会断点给我们停住,对吧?我们来看一下这个效果是不是我们想要的。这个地方,我们直接让他跳过, ok, 好, 他停住了,对吧?然后我们来看一下这个 user, 哎,确实是十一,然后刚才那个 users, 它应该是有两条数据,对吧?一个是 user id 等于十一,个是 userid 等于十一,所以说这个时候呢,我们的条件断点就生效了,那用这种方式呢,就可以极大地来提高我们断点调试的一个效率,缩短我们断点调试的一个时间。 ok, 我们让这个程序继续往下走下去啊,那接下来呢,我们来演示一下这个断点的回退啊。断点的回退什么意思呢?就是说你断点执行到了一个具体的行号,然后你发现那个行号上面的一些内容你没看清楚,你想 让他退回去啊?重新执行一遍,你再来做一些调试,再来做一些这个细节的查看啊,这个时候呢,我们就可以用到这个断点的回退啊。首先我们在第一行打一个断点,然后我们会有一个方法是 get user from others, 然后我们在这个地方呢给他打一个断点, ok, 然后我们来演示一下这个是什么样的一个效果, ok, 呃,我们首先来运行一下 debug, okay, 看一下啊,哎,他在第一行停住了,对吧?然后我们直接让他跳到这个 get users from other 这个方法,然后呢我们让他执行一段啊,这个就是 你现实生活当中的一个具体的逻辑了,但是现在我用一个输出来表达了, ok, 你发现你执行到这一行的时候啊,一百零四行的时候,你发现你之前的那些行好像有点没太看清楚,那这个时候呢,你就可以来选择这个断 点的回退啊,新的这个 id 它是非常的便捷啊,就是在你执行的这一行看到没有,这个有个第八个面板,然后下面有一个 frames 是你执行的这个战争,然后在每一针的这个前面呢,他会有一个撤回的这样的一个 reset frame 的这样的一个快捷操作。 那你老一点版本的 ida, 它可能是在这个上面的这些符号这一区域啊,那你就根据你自己的一个方式去找到这个 reset frame 或者是 drop frame 的这样的一个操作就可以了。这个时候呢,我们选择这个 reset frame 啊, 你可以看到他直接就跳出了这个方法,然后把断点啊调到了这个进入方法之前的这个时候, ok, 那么我们再往下执行的时候呢,我们首先来看一下这个控制台,刚才我们是已经打印了这个 get users from others 这个输出了,对不对?我们再往下执行一下, 哎,他还会打印,对不对?那如果说你还没看清楚,哈哈,或者说你在给别人演示的时候,你还想回退也是可以的,就回退就行了,然后我们再往下走, 哎,这个时候再来看一下控制台输出了三次,对吧?所以说呢,这个就是非常便捷的一个方式了啊,可以让我们去,呃,回到过去,哈哈哈哈,回到过去,对吧? 那第三个呢,就是去执行表达式了啊,这个执行表达式可能很多同学都已经知道了啊,我们首先在这个地方给他打一个断点, ok, 来个第八个, 哎,它这个地方是有一个方法是 get user from other system 啊,我们让它往下执行下去,然后这个地方 user 它有可能三方系统它有问题啊,或者说,呃,三方系统返回来的这个 user 它里面有某些,比如说 id 啊,比如 说一些啊属性啊,不是你现在想要的啊,就是你很简单的拿到一个 user, 不能够去满足你下面的一些逻辑,你明白我意思吗?比如说下面你有些判断啊, user 什么什么属性等于什么什么啊,才会执行那个东西。那么这个时候呢,你就可以去执行一个表达式, 你可以直接在这个地方执行啊,新版的 ida, 他这个地方会有一个快速的 expression 的这个表达式的输入框,你可以比如说 user 啊,点 set id 等于十或者十一,对吧?然后你完事了之后呢,你一运行,你会发现这个 user 现在它的一个变量就变成了 id 等于十一。 还有另外一种方式呢,就是你可以去执行这种长段的啊,这个地方有一个 evaluate expression 啊,或者是这个在 mac 下面的是 ctrl 加 f 八啊,我们点完了之后呢,这个地方就可以让你去执行这个大段的这 那个 user expression, okay。 比如说啊,我之前有一个 case 是这样的,就是线上有一个问题,然后他, 呃,在数据组装和数据拼接的时候啊,就他没有完全的任何和数据库的交互,和缓存的交互,和其他系统的交互,就是一个内存当中的数据的转化这样的一个东西。然后我发现那个地方有 bug, 然后呢我就把线上的那个 查询数据的那个结果给打印出来,然后把那个线上的那坨数据的 jason 粘到测试环境啊,粘到我本地,然后我在这个地方呢搞了一个 jason, 点 pass object, 然后把那个 jason 传进去啊,把这个 user, 这个 user 就大概这么个意思吧,点 class, 然后让他序列化一下,那这个时候这个 user 不就跟你线上那个 jason 那个东西一模一样了吗?然后你就可以继续让代码往下走,你就 专门看哎,那个数据组装那块的逻辑啊,为什么线上那个数据会有问题啊?所以说这个查起来啊就非常的有用。 ok, 所以说这个是我们的一个执行表达式啊, 我觉得就是说,呃,你学会了这个执行表达式以后,你后期在断点调试的时候,他会有非常多的一个使用场景,比如说你去修改他的一些值啊,去实现某些条件的运行,对吧?包括就是我刚才说的线上数据,那个本地副线啊,都是能够用的上, ok, 我们让程序走完吧。啊,那最后就是我不想继续往下执行了,我想跳出这个特别简单啊,我这个地方首先给他运行起来, ok 啊,我们往下运行, ok, 然后首先是查出来的这个 u 子,然后我们去执行了一堆巴拉巴拉的锁 记,对吧?然后我们发现我们这个逻辑呢有点问题啊,不能够继续再往下执行了,因为你继续往下执行,他这个地方就把数据库的一个值给更改了吗?对不对?然后如果说你测试的这个数据很难造,然后你还要去删数据,或者说你要去改一些数据库的值, 那就很麻烦,所以说你已经找到了这个问题所在嘛,你就不想让他继续往下运行了,很简单,你就把光标定位到这个执行的这一行,然后右键这个地方呢,有一个 force return 啊,当你去点了这个 force return 以后呢 啊,那么他那个 update 语句就不会执行了哎,你会发现他这个地方是没有去进行任何的数据库的这个 update 的操作的啊,就是那个 my badest 的这个 map 的一些打印没有打印出来啊,所以就证明我们的这个程序已经跳出了 ok, 后续是没有再进行操作的。那这个时 视频呢,我们就简单讲这样几个小玩意啊,如果说大家对于这个的 bug 的一些调试技巧啊啊,实操啊这方面的一些内容有感兴趣的话呢,可以来点赞这个视频啊,然后想要听哪方面的一个内容呢,也可以在下方的留言,我们一起来交流一下。 好的,那以上呢就是本期视频的一个全部内容了,感谢大家的收看,我们下个视频再见吧! peace 三连支持一下!三连支持一下。

大家在第八个程序的时候是否遇到过因为下一步按的太快啊,导致跳过了想要深入分析的那段代码,是不是很想要有回到上一步这样的一个操作呢? 在第二中其实是有这样的一个功能的,但这个功能并不是万能的,下面我带大家一起看一下这个功能在哪里,以及他具体是怎么用的。 我这边准备了两个测试用力,主要用来演示这个功能,一个是可以回退的情况,以及是以及不能回退的情况。首先看一下第一个测试用力 test one, 这是一个顺序结构,没有任何签套的内容,对吧?这种情况的话我们可以看一下,我先打个断点,然后用第八个把它抛起来 啊。先来看一下这个功能在哪里?呃,在左边,这边 frames, 大家可以看一下,这里有个这样的一个按钮,我们把鼠标全停上去,可以看到它这个按钮的名字叫 reset freeman, 看下面说明可以知道它其实就是一个让你回到上亿级 freem 的一个操作,对吧?然后大家思考一下啊,这里其实这里其实有多少个 freem? 好,在这种情况下面大家想一下这个功能是可以用吗?我来点一下, 在顺序结构的时候,其实他当前情况只有一个 frame, 所以用 the set frame, 他其实是没有办法回到上一个 frame 的,因为他根本就没有上一个 frame, 对不对?所以我们去点他的时候应该是有报错的好,所以说当这种顺序结构 还出顺序结构执行,那么 reset the frame 是没有办法帮助他回到上一步的,这是第一种情况,好了,然后再来看一下 test two, test two 和 test one 有一个区别,就是我们把这边 a 加 b, 我们把它抽向成了一个函数,那这个函数呢?它起的个作用就是把 a 和 b 分别打印一下,然后再把 a 加 b 加起来获得 c, 功能是跟上面是一模一样的,对吧? 那这边其实我们需要分来分析一下代码啊。呃, task two 的主题,它这边 abc 执行下来,由于 c 会调用 a 的,所以这边其实它是会有两个 frame 的, 一个是 test two 的,一个是爱的的,然后爱的是在 test two 里面,对吧?所以说,如果说我把 我把 test two 执行起来,运行到 id 这一步,然后再下一步进到 id 里面,那这个时候其实是有两个 frame, 那么我们通过 reset frame, 其实是可以从 id 的这个 frame 里面去往跳到 test two frame 里面,那么 add frame 执行的内容就 会被就被回退了,对吧?好,下面我们来试一下啊。断点加在爱的这边,然后用第八个跑起来, 好看一下啊,现在静态骚扰了,对吧?然后我通过下一步啊进到艾德了,然后看到没?现在,现在是,现在是有两个,对吧? 那么,呃,因为现在是输出嘛,我要让他执行两下,看到 a 和 b 输出了,对吧?那这两句话已经执行了,那这个时候 普通的第八个 reset 一下回到上一个,哎,又回到 taxi to 了,爱的那个夫人不是 reset 掉了,对吧?好,呃,这个时候我再重新执行, 哎,这个时候再来看康索一下,发现,哎, a 和 b 他又输出了一次啊,所以这两句又重新执行了,是不是 再来试一下啊?再来回退对吧?那么这个时候点还有没有用?肯定是没有用的,因为大家看到 thats too 已经是在顶层了,他已经没有办法再再往回跳了,所以跟这种情况是上面讲的那种情况是一样的。 关于 raser free 这个功能,可能看了这个视频的小伙伴有可能会问,怎么找不到这个按钮? 如果是这种情况的话,大家要去检查一下 id 的版本,因为你现在大家看到的这个 rest free 的这个名称以及这个按钮的位置其实是 ida 最新版本二零二二点一版本星座的调整, 比如说现在你看到的这个是最新的情况,那么老版本的情况是怎么样的呢?老版本的话,其实他首先第一个他不叫 rest frame, 他叫 drop frame, 然后他的位置的话不在这里,而是在,呃,而是这,而是在这,而是在这边 啊。贴个图给大家看,更直观看一下,对,就是这个。好了,今天的分享就到这里,如果你觉得这个分享对你有用的话, 呃,最好是大家要实操一下,因为调试这个这个过程其实还是大家非常会常用的,但是因为这个回退稍微有一些复杂,我自己操作一遍的话会记,记得会更 更深刻一些。嗯,最后如果你觉得这个内容有用的话,记得帮我三联支持一下,呃,这边会持续为大家分享更多开发小技巧。

hello, 各位小伙伴大家好,我是一锅炖不下的北冥,那今天呢,咱们来聊一点有意思的啊,我们如何去快速玩转 idea 当中的远程 debug 调试 这个功能呢?实际上非常有意思啊,想必你肯定遇到过一种情况六,就是咱们在线上或者说在测试环境我们遇到了一些问题,但是我们在本地测呢又没有发现, 那可能两份代码呢都是一样的,但是数据呢可能有些差异,所以说在本地呢是发现不了,但这个时候咱们怎么去调试呢?这个功能想必就能够帮助你啊。 在这呢,我们先来看一下,我在这边是创建好了一个测试工程,我在这呢是创建好了一个 speaking 部的的工程啊,非常简单,里边呢是有一个接口叫做 hello, 然后呢是有三行打印语句,那最后呢是有一个 return, 非常简单,因为视频时长的一个 问题啊。我在这呢就不为大家去演示打包和放了服器了,我在这边呢已经提前准备好了一个架包。那如果咱们要去配置 idea 的远程 debug, 那肯定逃脱不了,要对 idea 当中去进行一些配置,对吧? 可以看到现在呢我用的是一个新版的 idl ui, 可能大家对这个 ui 呢有些陌生,但是基本的操作呢是一样的,那如果大家想用这个新版 ui 的话,可以去选择 idl 这个位置有一个配置, 然后呢咱们就可以在外观这个部分选择新 u i, 然后呢点击启用,然后重新打开第二呢就 ok 了。 好, ok, 那如果大家想要了解这个新版的 ui 的话,可以给我去点一个赞啊,那如果点赞过三百的话,我可以专门出一期视频来给大家去进行一个介绍。好,那回到主题啊,咱们要去配置的话,首先 选择这一块区域,然后呢点击编辑配置,在这呢,我们可以看到左上角有一个加号,对吧?点击这个加号,然后呢咱们去找到往下滑,找到这个远程结尾幕调试啊,选择他。当我们加进来的时候,首先第一块是名称对吧? 那名称呢实际上也不太重要啊,大家可以随便取,那第二款呢也不用改,那最关键的是一个主机地址的配置,这个地址呢非常重要, 那对于网络的要求呢,也是比较严格的,因为我们的生产环境当中,可能环境和我们开发环境是隔离的,我们无法访问到,但测试环境呢,基本上都是可以的,所以咱们呢要视情况而定啊, 可能在线上呢是没办法用这个功能,但是在开发测试环境呢都是可以的啊。 ok, 那咱们呢就改一下这个主机地址,我呢已经提前准备好了 ip 啊,咱们直接粘过来就可以了。 好,那第二个呢是端口,这个端口呢是专门用于本地的 idea 和远程的服务端去进行通信的,这个端口地址呢你随意配置,你想怎么配就怎么配,只要不冲突就可以了 啊。看到下面这一块,这一块也比较重要啊,大家要记一下,因为在不同的 idr 版本,那这一块呢咱们要去选择,如果你是八,那要选择这个,因为这一段命令行呢,是它自动生成的,所以说会有一些变化,那大家对这一块呢要谨慎一点,我这边呢是用的十七,所以说我选择这个加九以上就可以了。 那最后一个就是使用模块类路径啊,这个呢他自己给我选上了,因为本身我这边是一个很简单的 swing 部的视力工程,所以说他只找到一个,这个也没有问题啊,但现在咱们很多的环境里面都是用 spring cloud, 对吧?那可能会有很多很多不同的服务,所以说我们要去调试不同的服务的话, 我们要在这一块呢去做一个选择。好, ok, 那最后呢点击应用,再点击确定就 ok 了,对于 id 的配置呢,就已经完成了,那咱们呢再打开它去把这一段呢给他去复制出来,这一段待会呢咱们要用到, 好吧,好,那点击取消,那来到了 idr 界面,那接下来呢咱们就去启动他,那我相信大家用过 nix 去启动过加瓦项目的话,也大概都能知道啊,非常的简单。 那第一步如果说我们需要去保留日志的话,我们要输这个 low hope, 对吧?然后第二个是 java, 那第三个呢是刚刚咱们复制的这个结尾,我们的参数好 ok 啊,端口呢咱们就不变了,那然后呢就是杠架,那后面呢就是把咱们架包的这个名称给他拿过来。好,那最后呢咱们要不要 后台启动?如果需要的话,那么就选择后台启动。好,然后呢回车,那咱们呢就看一下日志,好,可以看到这边已经在慢慢的启动了,对吧? 好,可以看到已经基本启动完成了。 ok, 那接下来呢咱们就去演示一下。 ok, 那咱们呢就把本地的这个启动,那怎么启动呢?可以看到这个 bug 的图标,那点击调试就 ok 了, 如果这边输出已连接到目标的 v m, 那就说明咱们和远程呢已经连接上了,那对于这个端口呢,大家也要注意一下, 因为有一些服务的话,你可能没有开防火墙,你只允许了咱们这个程序的端口可以访问,但是你这个配置远程连接的端口你没有开启的话,那实际上也连不上啊,这一块大家也要注意一下。 ok, 那这一块启动之后呢,咱们就来到这边 边的演示界面,这个演示界面呢地址我已经提前准备好了,咱们就回车,好,可以看到现在已经能够访问了,对吧?啊?咱们呢就到咱们刚刚演示的这个 hello 这个接口去,在 return 这一块,咱们打个断点去试一下, ok, 再回车, 可以看到这边断点已经进来,对吧?那咱们的远程第八个调试呢,就已经成功了,那接下来呢,再跟大家去讲几个注意事项,也讲几个大家比较关心的问题啊。首先第一个 我停在本地的断点,那我关闭程序之后,他会不会继续的执行,这个大家肯定比较好奇,对吧?我们来为大家演示一下,那先看一下日志吧, 可以看到这边是打印的,点赞关注,投币点赞关注,对吧? 好,咱们呢就把咱们先把它去进行一个放行啊。 ok, 可以看到三个都已经打印出来了啊,那咱们呢就把这个断点改到第一行 来验证咱们的一个问题啊,我们就重新启动一下, ok, ok, 咱们来就再访问一遍,可以看到断点已经打在了第一行,对吧?此时咱们呢就把这个 idea 给它停掉,好,可以看到已经停完了啊。再来看一下 这边的点赞关注投币,这个日志是不是还是出来了,对吧?所以说他的一个结论是, 尽管我们停掉了本地的断点,但他还是会执行的,因为本地呢,只是做到了一个 debug 的功能,但是他并不能够去干预我们远程的一个执行啊,所以说尽管我们关闭了我们的 远程,但他还是会运行的,这个呢是第一个。那第二个,如果咱们驾包中的代码和本地的代码不一致,那会发生什么样的情况呢?这边第十九行是打印的,点赞二十,关注二十一行投币,对吧?咱们就把点赞和投币给他删掉, 把断点呢切到第十九行,那咱们再启动一下,再请求一遍, 断点已经进来了,第十九行,我们再来看一下日志,我们会发现他现在一行都没有打印,对吧?那这个问题是什么呢?因为咱们刚刚第十九行是点赞, 所以他断点是打在第十九行,并不是打在关注这一行,这个呢,是为什么三行都没有打印的一个原因啊。所以对于这一点的结论是,我们要尽量的去保证线上和本地的代 码是一致的,如果不一致,他会根据行号来断点,他并不是根据我们本地的代码来断点,这个大家要注意,那咱们呢就把那两行恢复回来啊。那再跟大家聊。第三个,咱们的日志打印在哪里呢?我们刚刚已经看到了,在服务端有打印,对吧? 那本地有没有打印呢?这跟大家讲啊,实际上本地是不会打印日志的,所有的日志他都是在远程打印的,这个刚刚已经看到结论的就不讲了,再带领大家去讲。第四个,先启动他。这个点呢,非常有意思啊, 就是咱们调试的时候,其他人会不会卡住呢?我们实践出真知啊,来演示一下。好,第一个已经卡住,对吧?来第二个, 好,可以看到并没有返回啊,那对于这一点呢,大家要注意一下,就是如果你遇到了类似的场景,你要 去用到这个 idea 远程 debug, 那大家千万注意,如果你 debug 的是线上环境,你很有可能会造成这一个接口,其他所有线上的用户都防不了了,那这个功能尽量的在测试环境用,尽量不要在生产上使用啊。 好,那关于几点细节呢?包括整个配置呢?都跟大家去讲完了,可能大家会感觉这个远程调试的用处也不是特别大,对吧, 也不能作为一个长期的调试工具,那只能临时的用一下。那对于这一点呢,大家可以就是把这个留个印象,可能在以后某个业务场景,在某个环境里面,你想去做一个远程的 debug, 那他呢,也可以做你的选择之一啊。 那关于今天的内容呢,咱们聊到这就结束了,依照惯例,笔记我已经准备好了,咱们简单的来看一下, 那可以看到这边细节呢,我已经写的非常清楚了,那包括这些配置的注视,那包括每一个 gdk 版本,那他的一个命令是怎么样的,都写的非常清楚,如果大家有需要这份笔记的话,那可以评论区扣一,然后呢?私信我去进行领取啊。我是一锅炖不下的北冥,那咱们下期再会。

哈喽,大家好,我是鱼仔,上期视频介绍了 debug 的八种断点,本期视频就来讲一下进入断点之后的一系列调试技巧。进入断点之后可以看到 debug 工具栏中有一些常用的按键,想看到更齐全的可以在菜单栏的 run debug actions 看到。 首先是第一个 step over, step over 的作用是一行一行的往下走,不会进入到方法的内部。很多人不理解和 step over 的区别, first step over 是强制往下一步跳,哪怕是当前行对应的方法中有断点,也会忽略掉这个断点,而 step over 会进入方法内的断点中。 第三个是 step in to, 这个功能会让代码进入到方法内部,但是一些外部价包的方法无法通过 step in to 进入。如果想要进入外部价包方法内,就可以使用 force step in to, 比如现在就进入了 print 方法内部。 第五个 smart step in two, 这是个很好用的功能,如果在一行代码中有多个方法,这个时候就可以通过 smart step in two 随意指定方法进入,而不需要一步一步的执行下去。当你进入了一个方法内部后,想要跳出就可以使用第六个功能 step out, 跳转到调用者方法处。 step out of code block 的作用是跳出代码快,比如调试负或者瓦欧循环的时候,就可以通过这个功能跳出循环。 狼图克瑞斯的作用是跳转代码到鼠标光标的位置,就好比鼠标光标在的地方就打上了一个断点,但是如果前一个断点的位置和鼠标的位置中间还有断点时,就会进入到中间的断点。 这个问题可以使用下面一个功能 force, 然后读科斯来解决,他会忽略掉中途的断点,直接跳转到光标。八种调试动作到这里就结束了, 我们再来看看其他功能。在第八个处可以看到现成的调用站,当第八个已经进入到某个方法内部之后,如果想要返回退到前一步执行的方法,就可以使用 reset freeman 功能,就会回退到前一步的方法调用。当然也可以直接在调用站中点击方法前的回退图标。 如果运行到某处断点后,即使关闭项目,接下来的代码也还是会执行,有时候就会产生很多脏数据。这种时候就可以使用 force return, 不执行代码直接返回 resume program, 会让程序进入到下一个断点,如果没有断点就结束运行。学会这些后,你的 debug 技术一定会强大不少。以上就是本期视频的全部内容了,我是鱼仔,我们下期再见。

在 idea 中进行程序调试的几个小技巧,看一下代码实例,这个代码比较简单,这个方法是用来进行计算的,我在第五行加了一个断点,咱们来执行一下, 现在想断点调试第七行,一般来说我们可以在第七行加入断点,然后直接往下走即可。这里咱们有个更好的办法,可以将光标移到第七行,通过 outf 九 就可以直接到断点我们光标的所在位置,现在想查看按的的方法加和是多少。咱们在这里可以输入表达式,然后敲击回车,可以看到他的返回结果。同样咱们也可以通过快捷键 outf 八唤醒双口, 然后同样输入表达是敲击回车,也可以看到他的返回结果。并且这里可以动态对参数进行复制,比如这边的 a 我复制为四,敲击回车 后,咱们在这边会发现他的 a 值已经变化了。同样如果咱们再用这个表达式,发现他的返回结果已经变成了六。最后再看一下在循环中调试指定条件,看一下代码视力,这是一个放循环, 我只想在 i 等于四的时候进行调试。这里咱们可以打入一个断点,然后鼠标右键在这个地方输入咱们的条件,比如说这里就是 i 等于四,点击完成,咱们在 debug 运行一下,会发现只有 i 等于四的时候进入了断点。小伙伴们还有什么实用的调试方法吗?评论区分享一下。

hello, 大家好,我是鱼仔,前面两期视频已经把 idea 中 debug 相关的基础知识点都介绍完毕了,这期视频是 debug 系列的最后一章, idea 中 debug 的高级技巧。第一个要介绍的是 watch。 在 debug 的时候,所有的变量都会被展示在 debug 栏中,如果想要监听某个变量的变化, 找起来会很麻烦,这个时候就可以使用 watchs, 我们可以在 debug 的扩展栏中将 watchs 展示出来,然后添加一个想要监控的变量或者是表达式, 接着在程序的运行过程中,你就可以一直只关注这些变量信息了。第二个要介绍的技巧是设置变量。在日常开发的时候,可能会遇到下面这种场景, 有一段代码逻辑在 if 语句内,但是需要造很多数据才能让代码进入这段逻辑,于是就可以代替 bug。 十、选择计算表达式的功能,接着手动修改变量的 来达到调试的效果,这个功能有时候可以帮你省下一大把的时间。第三个技巧是异常抛出。有的时候我们希望能主动让一个方法抛出异常,从而测试异常抛出后的代码逻辑。 比如测试事物的时候,又或者模拟生产商的某个报错,就可以使用 debug 中的 siri exception。 比如现在在这个断点中,手动抛出一个空指针异常,就可以选择站中方法后,右键 选择 through exception, 接着写一个 new number enter exception, 这样一个空指针异常就从这个方法处返回了。 第四个高级技巧是 zbm 堆大小的监控。不知道大家在写代码的时候会不会关注自己究竟创建了多少个实力对象,出来 idea 就可以来告诉你。打开第八个扩展功能中的 memory, 在 memory 中就能看到不同的类实力,被创建出来的字 次数,通过筛选功能就可以看到具体的类。在上面这段代码中,优泽类一共被创造了两个实力出来,而如果使用单力模式的话,创建出来的 student 这类实力只有一个。 第五个高级技巧是断点开销的监控。有时候打了很多断点,会让项目的执行变得很慢,尤其是一些复杂的条件断点,这种时候就可以通过 over here 的功能来查看每个断点的执行速度, 以及这个断点被执行了多少次。如果发现有个断点或者断点功能耗时的话,就可以去掉,节省资源。以上就是本期视频的全部内容了,我是于仔,我们下期再见。

哈喽,大家好,我是鱼仔,对开发来说,点 bug 是查问题最快的方式,打算发几期视频来介绍一下使用 idea 进行点 bug 的基础知识,以及一些高级用法。 断点是 debug 的基础,在 idea 中基本的断点有四种,首先是行断点,这是最普通的断点,你可以在想要让代码停下来的位置点击打上这个普通断点,当以 debug 模式运行时,代码运行到这里就会停下来。 第二种是方法断点,方法断点是打在方法上的断点,右键这个断点可以选择监听方法的进入和退出。再次运行的八个模式可以发现在进入和退出方法时都被断点给拦住了。 第三种是属性断点,可以在属性上打上这个断点,右键属性断点后,可以选择监听属性的获取和修改运行点。 bug 模式时,所有属性发生变化 的方法都会被断点拦截。第四种断点是异常断点,比如我现在想在发生空指针异常时,让断点暂停在那里,就可以打开断点列表,在这个异常断点处新增一个空指针异常的断点,当发生空指针异常时,断点就会停留在发生异常的那涵弹码。 以上是四种基础断点,通过这四种基础断点可以生成下面四种衍生的断点。第五种是条件断点,比如在一个负循环中,我只希望在 i 等于五十的时候才让断点生效,就可以右键行断点,在 ctrl 输入条件, i 等于五十, 于是只有在满足条件时,断点才会阻断程序运行。第六种是原断点,主要是用于想在控制台上输出某些变量内容的情况,右键方法断点, 然后选上 log 和 invaluate and log, 接着这个变量就可以被输出到控制台了。你可以选择不阻断代码,然后只打印信息,这种断联可以让你不用靠代码而直接输出值。 第七种是多线程断点,有时候为了模拟多线程的运行情况,比如让 a 线程执行一次,再让 b 线程执行一次,这种情况就可以用多线程断点实现。右键行断点,然后选中 siri 的, 然后你就可以先让所谓的零运行一步,再选中所谓的一,让所谓的一运行一步,再用同样的方式去选择所谓的零, 以此模拟现成的轮寻执行。最后一种是 stream 断点, stream 的代码会被写在一个代码段里,在在 stream 的代码行加上断点,就可以在运行到这行代码时,点击 stream trace, 你就可以看到数据的所有流转情况,十分好用。以上就是本期视频的全部内容了,我是鱼仔,我们下期再见。

哈喽大家好,我是于仔。在测试环境中有时候会出现一些比较离奇的问题,并且可能很难在本地进行调试,这种情况下就需要用到远程 d bug 了。 在 ida 的教程官网中有专门一张讲了远程的 bug, 本期视频就通过一个实际的例子来演示远程的 bug。 首先我写了一个简单的 get 请求接口,里面随便写了一些简单的时间代码,并把这个 steam 布置项目打成了价包, 同时本地启动一个虚拟机,将这个价包上传。这个时候需要在远程启动这个 speed 部的项目,启动的时候需要加上一系列的参数,可以在官网找到这个启动命令, 项目的启动和正常的启动没有区别。 接下来配置本地 idea, 选择 edit configurations, 点击左上角的加号,选择 remote jbm debug, 接着进行配置 name 随便取一个就行。 house, 填写远程服务器的地址端口,填写和参数中地址一样的端口并非是项目的启动端口,然后选择一下正确的 model, 这样远程 d bug 的配置就结束了。首先我们直接在服务器上调用一下接口,可以看到调用没有问题, 并且在控制台上也输出了对应的内容。接着在本地启动远程 debug, 再次调断点直接在本地停下了。接下来就可以像本地调试一样对远程过来的请求进行调试。 需要注意的是,这种调试也和本地的 bug 一样,会阻断远程项目的运行,所以只能在测试环境以这种方式启动项目。以上就是本期视频的全部内容了,我是鱼仔,我们下期再见。

bilibili hi, 大家好,我是玉峰,欢迎大家收看本期 tiktok。 那么今天这个视频呢,我们将一起来介绍一下如何在 ida 当中进行远程的断点调试。 ok, 首先呢,我们一起来看一下远程断点调试它的一个流程大概是什么样的?我这个地方简单画了一个图啊, 首先呢,我们只关注啊右边的这一部分啊,这个是我们正常访问服务器它的一个流程,比如说这个地方,是啊,用户的一个电脑,对吧?这个是我们远程的一个服务器, 正常情况下用户访问啊,幺九二点幺六八三幺点二二四八零八零啊,给这个服务器了,服务器呢应该是返回一个结果给他,比如说这个 hello world, 对不对?但是现在呢,我们要加上左边的这个本地的 i d a 的啊,这个远程断点调试我们怎么做呢?它其实是这样,首先用户访问服务 服务器得到了这个具体运行的这一行,比如说是三十七行啊,三十七行的某某某某代码段,对不对?然后呢他就会去问一下本地跟他连接的这个 ida, 哥们,你这边有没有三十七行的断点啊? 然后 ida 他就自己检查了一下,哦,我的断点列表当中有一个什么什么类的三十七行啊,用户打了一个断点,然后呢就 开发人员开始调试,对不对?得到的这个参数啊,访问的这个结果呀,中间运行的一个流程,一副 x 判断呢,是不是这个开发人员他想要的一个结果? ok, 开发人员说,啊,是我想要的这个结果,那么这个 断点调试的过程就结束了,接下来呢他就会把放行断点结束调试的这样一个信息返回给我们的这个服务器啊,服务器就收到了,服务器就啊返回正常的这个运行结果 给我们的这个用户了啊,这个就是我们整个的一个啊,断点调试它的一个过程。那么接下来呢,我们就一起来演示一下如何在 ida 当中配置远程断点调试。首先我们需要去来到的是这个 run and debug configurations 啊,就是运行和调试的这样一个配置面板,我们点击一下这个加号 啊,你可以发现我们这个 ida 它支持的这个各种各样的运行方式很多啊,我们直接来输入这个 remote 啊,然后找到这个 remote jvm debug 啊,就是远程的这个 jvm 的这个断点调试,对不对啊?这个非常的见明知义啊,然后这个地方我们给它取一个名字叫做这个 remote debug demo 啊,这个地方我们需要去设置几个东西啊,首先是这个断点调试的一个模式啊,你到底是 attach to 还是这个 listen to 啊?通常我们选择的是这个 attach, 什么意思呢?就是你可想而知啊,你远程运行的那个服务器啊,他是线上的环境啊,通常来讲他的一个启停是很少的啊,一般来讲都会一直在运行,对吧? 如果说你是非常重要的这个业务的话,所以说不存在什么一直荡机啊,来回启动之类的,所以说我们只需要去本地启动了,然后我们 衣服上远程的那个端口就可以了,对吧?啊,那么可想而知,这个地方我们就要需要去填写的是远程的这个端口啊,远程的端口是幺九二幺六八三幺二二四啊,幺九二点幺 六八点三幺点二二四,没有任何问题。然后呢,就是你要指定一个端口啊,这个端口是远程的服务器和我们本地的这个 ida, 他们两个进行 socket 链接啊,远程断点调试链接的这样一个端口, 五零零五啊,这个是默认的,你可以自己去改啊,当然了,如果说你的这个远程服务器,他是阿里云或者是华为云啊,或者说其他的那种拥有防火墙或者说网络进出口这个安全控制的这样的一个 啊,这一层的话呢,你可能需要去打开五零零五的这样的一个放行规则,才可以实现这个远程锻炼调试啊。那么当你把这些东西都输入完毕了以后呢, ida 会帮我们生成一个命令行 这个参数啊,大概就是这样的一个东西啊,我们把它 ctrl c 复制一下,然后 apply, 然后 ok, 接下来呢,我们就来到远程运行的这个服务器啊,然后我们看一下他当前项目运行的这个文件夹啊,这个地方有一个 demo, 什么什么点架啊, 正常的情况下呢,我们如果说要去运行一个 spring boot 架包的话,是这样的啊,架把钢架,然后这个 demo 就完事了,对不对? 但是现在呢,我们需要去给他稍微做一下修改啊,首先我们要给他来一个大写的 x, 然后给他一个 debug 命令啊,接下来我们要做的是 debug 的操作,对不对?然后呢就需要去把刚才 ida 那边 啊,给我们生成的这一段参数复制过来啊,然后呢我们给他来一个杠架,然后是这个就可以了,对吧?但是你会发现他这个地方 报错了,对吧?啊?这个是为什么报错呢?因为这个地方我们有一个新号啊,这个新号应该是要给他做一个转移啊,这个命令行才会接收到一个完整的运行的参数啊,你这样直接写的话呢,他是会报错的,无法识别,所以说我们这个地方给他加一个反斜杠就可以了, 转移字符吗?然后运行啊,没有任何问题,对不对?现在呢他给我们输出了这样一段话啊,就是我们通过 过这个 dt socket, 然后监听的一个端口是五零零五,然后我们的项目运行是在八零八零啊,然后接下来呢,我们就来到浏览器幺九二点 幺六八三幺八零八零啊,这个地方他要加一个名字,比如说,然后这个地方他就给你打印出来了这个 hello, eric。 然后接下来呢,我们就需要去运行我们的这个本地的程序了啊, 我们这个地方啊,打开这个 configurations 这个面板,然后选择刚才我们配置的那个 remote 第八 demo, 然后这个地方只有小虫子没有小三角啊,也就是说你只能是断点调试的方式来运行它,我们运行它 ok, 没有任何问题。他这个地方显示的是我们已经和远程的那个机器连接了啊,端口是五零零五,然后是 socket, 对不对?然后接下来呢我们就 可以去打断点了啊,我们在这个地方给他打一个断点,然后看一下程序是否可以停止啊?我们再运行一下,嘿嘿,你可以发现这个地方程序已经停止了,对不对?然后我们得到了传入的这个参数啊,然后我们就去运行我们的程序,让他走完 啊,没有任何问题,现在他就返回了,对不对?比如说现在我们把这个地方给他改一下,叫做加吧, ok, 然后这个地方过来的就是加吧啊, 没有任何问题,我们把它走完。可能到了这个时候呢,有的同学就会有一个疑问啊,就是比如说我们把本地的代码给他改一下啊,会不会返回给用户的这个信息就变了呢? 我们可以来做一个简单的测试,然后呢我们把这个重新启动一下啊,重新给它启动一下,然后现在呢,我们还是这个地方调用这个 eric 啊,然后这个地方过来了,对不对?然后这个名字也是 eric, 然后我们让这个程序往下走, 接下来我们就是见证奇迹的时刻,对吧?哎,你会发现啊,这个地方虽然说我们本地把代码改了,但是我们本地的一个修改没有部署到线上去啊,没有和线上做一个同步。所以说呢,我们程序运行的逻辑还是按照线上的那个来走的啊。 那么同样的一个原理啊,比如说你这个地方又添加了很多其他的行,对吧?但是呢,我们的这个程序本来他只有两段话,对不对啊?就是第一个是这个输出,第二个是这个返回啊?原来呢,你是可以打断点在二十行和二十一行, 本来二十一行是这个返回吗?对不对?这两个地方断点你是可以打的,这些地方你打了断点以后呢,他是没有任何作用的啊,你在本地运行他其实也没有任何作用啊, 就好比是刚才我们这个地方把那个 hello world 改成了这个 hello 啊,他对于远程的这个结果是没有任何一点点改变的啊,所以说这个在我们实际运用的过程当中呢,是需要去注意一下的啊。 好的,那么以上呢,就是本期视频的一个全部内容了,如果大家觉得这个视频做的还不错的话呢,请帮忙点赞,投币分享,一键三连支持我一下。那么如果你还没有关注我的这个频道的话呢,也请你点一下关注啊,我的这个频道是专注于程序员干货,视频教程分享,关爱程序员身心健康这样一个频道。 ok, 我们下个视频再见吧, peace。