2017-03-12 186 views
1

我有一個JVM應用程序,需要在IntelliJ 2016.3.5中使用具有Gradle任務(運行並測試爲依賴關係)的斷點進行調試。在Gradle和IntelliJ中使用斷點調試JVM應用程序(Java或Scala)2016.3.5

有關於如何用搖籃和IntelliJ完成調試各種來源:

  1. Debug Gradle plugins with IntelliJ
  2. Using Intellij to set breakpoints in gradle project(最有用的一個)
  3. https://youtrack.jetbrains.com/issue/IDEA-119551
  4. https://youtrack.jetbrains.com/issue/IDEA-86465
  5. https://youtrack.jetbrains.com/issue/IDEA-119494

但是,這些來源要麼過時,要麼意味着另一種情況。我不想調試Gradle腳本,而是運行實際的Java/Scala應用程序的JVM。而且,IntelliJ的最新版本使用Gradle Tooling API,它不提供關閉守護進程的選項。 JetBrains提供的本地支持僅在運行和測試任務中直接使用調試按鈕提供,但如果它們被定義爲來自其他任務(例如,檢查)的依賴項,則不提供本地支持。

據該人士透露,這是要走然後方式:

run { // or test, doesn't matter 
    jvmArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005" 
    // xor, or both, doesn't seem to make any difference 
    debug true 
} 

以任何方式,搖籃(或JVM)就會開始爲偵聽端口5005:

Imgur

然後,我創建了一個具有以下參數的遠程配置:

Imgur

但是當我啓動的IntelliJ遠程調試任務,它失敗:

Imgur

我也使用端口5006和暫停= N沒有成功嘗試。在此之前,我嘗試在IntelliJ-Gradle運行任務中使用Gradle參數。然後,它確實連接了,但看起來像Gradle腳本,而不是應用程序JVM,因爲它沒有在斷點處中斷。如何解決這個問題?

+0

爲什麼你不能簡單地用搖籃調試配置,例如在Gradle工具窗口中使用gradle任務上下文菜單中的調試操作? –

+0

因爲在這種情況下,它實際上是爲我調試Gradle腳本,而不是Java或Scala代碼。這意味着,Java或Scala代碼中的斷點不會執行任何操作。 –

+0

我重新檢查過它,甚至沒有調試過Gradle腳本。 –

回答

0

同時,我自己找到了解決方案。如果您遇到類似問題,請使用調試選項按照上述方法操作。

test { 
    debug true 
} 

但要確保外部連接的設置接受的IntelliJ重新啓動後:

Imgur

Imgur

然後,它連接到正確的JVM,並使用在斷點處中斷遠程任務:

Imgur

Imgur

如果重新啓動的IntelliJ,但是,與(外部連接)啓用了同樣的選項,那麼調試任務可能會失敗,由於存在阻塞端口:

Imgur

所以,出於某種原因,IntelliJ會在重新啓動後阻止該端口,但需要啓用調試任務的設置才能工作。這很奇怪,我不認爲它的行爲就是這樣。

無論如何,如果您禁用設置並重新啓動,端口將再次打開。然後,重新啓用設置,不要重新啓動,只需運行Gradle任務和調試任務。它會工作。

我希望這可以幫助其他人尋找一箇中間解決方案,用Gradle和IntelliJ來調試JVM應用程序,其中包含令人困惑和部分過時的答案。如果有人有更好或更簡單的建議,請隨時附上您的答案。

1

像「測試」,「跑」,實際上是實現了JavaForkOptions接口的gradle所有任務,gradle這個任務調試應的IntelliJ工作,因爲2014年

+0

奇怪的是,如果我使用調試按鈕,則簡單地忽略斷點。你可以分享你正在使用的Gradle版本嗎? –

+1

使用哪個版本幾乎沒有關係,實際上從1.9開始的所有版本都可以使用。 –

+0

你能分享這個項目來說明這個問題嗎? –

相關問題