# 5.IDEA调试技巧2——远程调试

#### 0x01 前言

本文将结合着远程调试weblogic来讲解如何使用IDEA调试远程应用，大家只要掌握核心科技就行

#### 0x02 开启JAVA应用的调试模式

一个应用想要被远程调试，必须以调试模式运行，对于jar包，开启调试模式也很简单

`java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar test.jar`

参数说明：

-Xdebug：通知JVM工作在DEBUG模式下；

-Xrunjdwp：通知JVM使用(java debug wire protocol)来运行调试环境；

transport：监听Socket端口连接方式（也可以dt\_shmem共享内存方式，但限于windows机器，并且服务提供端和调试端只能位于同一台机）；

server：=y表示当前是调试服务端，=n表示当前是调试客户端；

suspend：=n表示启动时不中断（如果启动时中断，一般用于调试启动不了的问题）；

address：=8000表示本地监听8000端口。

当然，对于Weblogic这种别人写的大型应用，启动是很复杂的，一般都会有一个启动脚本或者环境配置脚本什么的，要想使这些应用运行在debug模式下，一般都是需要修改对应脚本的，至于到底是修改哪个脚本，我们可以Google一下，当然，如果搜索的结果不靠谱，也是可以自己摸索的，主要就是通过粗略阅读启动脚本，搜索脚本中的debug、port等关键字，然后修改对应的值（只是这么一个思路，具体情况具体分析）

weblogic就是一个通过脚本启动的应用，且它有一个专门的环境配置脚本，要想让Weblogic运行在debug模式下，就要修改这个脚本

![](/files/3JzsSMQuWUqR9AOulaGC)

如上图所示，由于我Weblogic是以产品模式安装的，所以我把setDomainEnv.cmd对应位置的debugFlag改为了true,然后运行启动脚本，Weblogic就会以调式模式运行。在同文件中还可以找到应用是调试端口是哪一个,当然，weblogic运行时，在控制台也打印出来了，如果你不清楚某个引用的默认调试端口，你甚至可以百度一下\~

![](/files/vJK756sJwJ5opw0hiKYB)

#### 0x03 IDEA配置远程调试

现在目标应用已经运行在调试模式，且我们也知道其监听的端口了，现在就是需要在IDEA上进行配置了。同样以Weblogic为例

1. **用IDEA随便新建一个工程**
2. **然后IDEA的右上角，配置一下** ![](/files/T2vV1aAiWmxNIqVnPAhy)
3. **创建一个remote server** ![](/files/GHU214gjgHSK362Erz4f)
4. **配置remote server** ![](/files/zCk72hGmfGS4gXt7QMrw)
5. **最后选择在右上角我们刚刚创建的remote server,然后点击这个小虫子** ![](/files/BC39nfvslMSaccwUPuLH) 可以从控制台看到，我们的idea已经成功连接到远端的应用

你以为这就结束了吗？并没有,因为要调试的是远程的应用，我们本地原本是没有远程应用的代码的，所以，即使是调试远程的应用，我们本地也要有一份远程应用的代码，没想到吧，死靓仔\~

我们下载好了远程应用的代码，然后需要把我们要调试的jar包啥的放到对应项目的lib下。具体操作如下，以weblogic为例，我要把weblogic中的一些关键jar包加到lib中：

![](/files/fuGxYEjWXnQZuuW1ccGt)

![](/files/EpSk0RrTamVxXHvQC2rk)

然后选择对应的目录就行了，一般就是把包含jar包的目录加进来,添加完过后就可以在IDEA中访问到很多jar包了，并且IDEA会自动反编译这些jar包中的class文件，我们还可以在对应的文件处下断点，然后就可以开始愉快的调试了\~

![](/files/ptltLnJxu0gmVW8b6AED)

#### 其他

一直在纠结有没有必要写这一章的内容，毕竟网上有挺多现成的，而且写好了，我不知道把本章内容放在哪个位置才合适，放在系统文章的开头，可能大家一时半会用不到，放在系列文章的中间，我又怕大家在看到这篇文章前就已经自己摸索出了怎么远程调试，那么我的这篇文章不就没用了吗\~

算了，为了系列文章的对新手友好，我还是稍微写一下吧


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://esonhugh.gitbook.io/javasec/5.idea-tiao-shi-ji-qiao-2-yuan-cheng-tiao-shi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
