毕业时写了一段时间的C,那时候调试使用gdb,后来转了java,当时就想java程序怎么调试,找了一下,果然,那就是jdk自带的jdb
windows里是这样的
![3d3775b79ebc9002c7a47661b052dfce.png](https://i-blog.csdnimg.cn/blog_migrate/9493cc2cf62a1c52123dc907e0ac6bd9.jpeg)
Linux下是这样的
![01cd9b6f15ef08fe04fe6b0a5e238a18.png](https://i-blog.csdnimg.cn/blog_migrate/49ea769227a10dfe1fa79f03d565fec2.jpeg)
一般我在linux下来调试Java程序
好,那么,问题来了,这玩意怎么用?有好几种玩法
第一种玩法:以经典的HelloWorld为例,先写一个Java程序,如下:
![ddc0f8b67feb802e5fff37508d34a917.png](https://i-blog.csdnimg.cn/blog_migrate/0f55ec32d6ff39e2b4f741d26f18abc1.jpeg)
我们把编译好的类上传到linux下,如下所示
![b540719ede666c9bb3e5bcc8252db696.png](https://i-blog.csdnimg.cn/blog_migrate/f348a0e50da7d566b441baa98e4f810a.jpeg)
务必强调一下:类所在的包名的层次结构也要在linux下体现出来
下面我们来玩起来,在linux下操作如下
![e0eb0a2eb06c4191437cffc169b8a55e.png](https://i-blog.csdnimg.cn/blog_migrate/e383a4b33179f83490080d1b9f0446e3.jpeg)
程序顺利debug,每次都输出当前的位置,就是line=5 这样的,也可以使用where来查看当前的线程栈,如下所示
![ef22735942adc2eff6338a8416a43681.png](https://i-blog.csdnimg.cn/blog_migrate/82b47c56910e97858557f7765f4934c5.jpeg)
好,到这里,入门完成,读者可能一脸懵逼,debug过程中没法看到源码啊,这是因为我们只有class,没有java文件
下面我们把java文件上传上来,可以上传到任何一个目录,只要后面正确指定就行了,创建一个文件夹
![aaa6595c1703b912fd689b5753b17be6.png](https://i-blog.csdnimg.cn/blog_migrate/3b945f20936d2e3f34df9da3b2fd7fbc.jpeg)
然后按照层次结构把源码上传上来
![794e10cfcbd497624daad82e93237d35.png](https://i-blog.csdnimg.cn/blog_migrate/d35b093965502a5f65c25ee9c528bf57.jpeg)
让我们重新组织下jdb的命令如下
![da4d2b273a1870319698c298d0c0baf4.png](https://i-blog.csdnimg.cn/blog_migrate/2aa4e6b8d675cef84de9b5b34e26389a.jpeg)
开心吗?简单的debug就可以进行了
有的同学说我有很多jar,不是类,这也是可以的,自己多尝试一下,没有问题,碰到问题百度下
上面是通过jdb来启动一个程序,也有一种情况是程序在linux上跑得好好的,我想去调试的时候去调试,不想调试的时候让它自己运行不去打扰它
以我最近调试的flink为例,ps -ef一把看一下
![8c0135d11c120fe50080a7ddd335486b.png](https://i-blog.csdnimg.cn/blog_migrate/7f6dad4c9c6d1cd8d05b8e9e57b6a1b0.jpeg)
程序启动的命令行里加上这些参数,然后怎么使用呢?在你想要去debug它的时候,使用下面的命令
![7ab2b3688ed9300b1f7c677155bc1612.png](https://i-blog.csdnimg.cn/blog_migrate/e068a362e5dc03664b8777e73cf59923.jpeg)
这个时候,jdb已经跟目标进程建立了关系,因为断点还没有触发,所以我们什么都看不到,我们尝试来发送一条消息到kafka来触发这个断点的hit
![79327436955fe1f0e2087cb3ced68ab8.png](https://i-blog.csdnimg.cn/blog_migrate/9ad9ad1d1e4866d479abddd1e4de0384.jpeg)
顺利命中,这里没有源码出现,是因为我没有放源码,我是在本地eclipse里打开java代码对比着看,读者也可以上传到linux下来玩,方法上面已经说过了
执行一把where看详细的当前位置
![f9a5c8f5da79ea7ee561bec8deeed667.png](https://i-blog.csdnimg.cn/blog_migrate/9a76d22f9ad2e8465c32b8c12365e475.jpeg)
时刻提醒你是谁,你在哪,你在干什么,别迷失了方向,迷茫的时候就执行一把where就会找到新的方向
这种方式不用指定class在哪,因为我们是连接到进程来实现debug,进程都起来了,也不用担心class的识别了
好,简单的debug其实已经可以了,下面讲一下jdb的命令有哪些
传送门:https://blog.csdn.net/xiaodejun5241/article/details/8162923
读者可以在实践中来掌握这些命令的使用
当你把所有源码都debug完一遍的时候,相信我,你的巅峰之路就开始了!K码农提供了很多不同领域技术,包含人工智能,android,ios ,前端,后端,大数据,云计算,区块链,物联网等大量的技术:http://kmanong.top