Simple-build-tool (sbt) ve IntelliJ ile Scala kodunda hata ayıklama


120

IntelliJ'in yerleşik hata ayıklayıcısını kullanarak sbt tarafından yönetilen Scala kodunda hata ayıklamanın en kolay yolu nedir? Sbt'nin google kod sitesindeki "RunningSbt" dokümantasyonu, bir proje veya testler için ana sınıfı çalıştırmaya yönelik komutları listeler, ancak hata ayıklama için hiçbir komut yok gibi görünüyor.

Takip eden soru: sbt'nin jetty-run komutunu kullanırken IntelliJ'in hata ayıklayıcısını Jetty'ye eklemenin en kolay yolu nedir?


6
Lütfen gelecekte soruları karıştırmayın
hennr

Yanıtlar:


47

IntelliJ'de sıradan hata ayıklama için, kodunuzu derlemek için sbt kullanıp kullanmadığınıza bakılmaksızın, bir Uygulama çalıştırma / hata ayıklama yapılandırmasını her zamanki gibi kullanabilirsiniz.

Jetty'de çalışan uygulamanıza bağlanmak için bir Uzaktan hata ayıklama yapılandırması oluşturmanız gerekir. Bunu yaptığınızda, IntelliJ size uzak JVM'yi çalıştırmanız için bir dizi komut satırı argümanı verecektir.

-Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, adres = 5005

Bu argümanlarla sbt'yi başlatın ve ardından çalıştırın jetty-run. Son olarak, IntelliJ'de uzaktan hata ayıklama yapılandırmanızı başlatın. Bu konu faydalı olabilir.


1
benim için Her zamanki şekilde iyi çalışmıyor: stackoverflow.com/questions/16337745/…
ses

Bunu nereye yazarsın? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Jwan622

@ Jwan622 Bu argümanlarla sbt'yi başlatın (örneğin, komut satırından, bunları komut satırı argümanları olarak sağlayarak). Ardından jetty-runsbt komut isteminde çalıştırın .
Aaron Novstrup

bu yüzden sadece koşmak sbt -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005?
Jwan622

3
Çalışması gereken çoğu kullanıcı için, ancak sbt'nin sisteminizde nasıl kurulduğuna bağlıdır. Diğer cevapta da belirtildiği gibi, sadece koşabilirsiniz sbt -jvm-debug 5005.
Aaron Novstrup

189

Mac, Linux ve Windows için -jvm-debugresmi SBT paketlerinde çok uygun bir bayrak var . Hata ayıklama bağlantı noktasını belirtmek için bayrağı kullanabilirsiniz:

sbt -jvm-debug 5005

Kapakların altında bu, tipik ayrıntılı hata ayıklama büyüsüyle SBT için JVM'yi başlatır:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

Artık kodunuzu normal şekilde, örneğin sbt runkomutuyla çalıştırabilirsiniz.

IntelliJ çalışan koda bağlanacak şekilde yapılandırılıyor ...

Artık IntelliJ'i bir Uzaktan Hata Ayıklama yapılandırması kullanarak çalışan sürecinize bağlarsınız . Bu formda üst 3 alanlar, korkutucu olurken, metin kopyalamak için sadece için olduğunu Not dışarı (sihir ayıklama yukarıda belirtilen ayrıntılı onlar veriyoruz ziyade içine daha bir -jvm-debugzaten sizin için halleder) - sadece yapılandırma değiştirebilirsin, Settingsbölümün yarısında:

IntelliJ'de Uzaktan Hata Ayıklama yapılandırması


1
Bu, Windows'ta çalışmıyor - bu (berbat) platformda nasıl benzer yapılacağı hakkında bir fikriniz var mı?
javadba

Bu, Windows için kullanıldığına inandığım başlatıcı komut dosyası: github.com/sbt/sbt-launcher-package/blob/master/src/windows/sbt . -jvm-debugParametreyi kabul etmek için komut dosyasını nasıl değiştireceğinizi bulmanızı ve bunu bir çekme isteği olarak göndermenizi öneririm - kendilerini aynı platformda bulan herkesten yararlanma şansınız yüksektir.
Roberto Tyley

İçine baktı. Windows başlatma betiği, linux'a karşı WAY ilkeldir. Şimdi yapamam.
javadba

1
Çekme isteği birleştirildi ... aşağıya bakın
Darren Bishop

3
IntelliJ'de "sbt -jvm 5005" i nereye yerleştireceğinizi bilmek yararlı olacaktır
eddy147

39

Bununla ben de biraz sorun yaşadım, bu yüzden aşırı detaylanma riski altında, işte yaptığım şey:

KURMAK

  1. SBT iskelesi için çalıştırma yapılandırması oluşturun

    • Çalıştır> Konfigürasyonları Düzenle'ye gidin
    • [+] Simgesine tıklayın ve Scala Derleme Sunucusunu seçin
    • İstediğiniz adı girin ve "SBT Eylemini Çalıştır" onay kutusunu tıklayın ve [...] menüsünden SBT Eylemi iskelesini seçin.
  2. Uzaktan hata ayıklama için bir hata ayıklama yapılandırması oluşturun

    • Çalıştır> Konfigürasyonları Düzenle'ye gidin
    • [+] Simgesini tıklayın ve Uzaktan Kumandayı seçin
    • İstediğiniz adı girin ve satırı kopyalayın -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005(yapılandırmayı gerçekten oluşturmak için Tamam'ı tıkladığınızdan emin olun)
  3. Yukarıdaki vm seçeneklerini çalıştırmak için sbt eklentisini kurun

    • Dosya> Ayarlar> SBT'ye gidin
    • Satırı -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005, halihazırda orada olanlardan sonra VM parametreleri kutusuna yapıştırın.

HATA AYIKLAMA

  1. Kesme noktalarını istediğiniz gibi ayarlayın
  2. Yukarıda oluşturduğunuz sbt jetty-run yapılandırmasını seçerek ve Çalıştır> Çalıştır'ı seçerek veya yeşil oku tıklayarak iskele web sunucusunu başlatın.
  3. Yukarıda oluşturduğunuz uzaktan hata ayıklama yapılandırmasını seçerek ve Çalıştır> Hata Ayıkla'yı seçerek veya hata simgesini tıklayarak uzaktan hata ayıklayıcıyı başlatın.

16
Yapılandırmalar Menüsünde Scala Derleme Sunucusu yoktur. Öyleyse Özel bir şeye ihtiyacım var mı?
Arne

sbt -jvm-debug 5005 consoleAdım1 gerekli değil gibi görünüyor, yaptığım şey sbt komutunu çalıştırmak , sonra intelllJ Idea'da kesme noktasını ayarlamak, hata ayıklamayı çalıştırmak.
Pengfei .X

@ Pengfei.X, sbt -jvm-debug 5005 consolebenim için çalışmadı, ama sbt -jvm-debug 5005yaptı.
Lukasz Czerwinski

8

Bu her seferinde benim için çalışıyor ve ayarlamanız gereken tek şey IntelliJ'de uzaktan hata ayıklama; SBT'yi IntelliJ'deki terminalden JVM parametreleriyle başlatıyorum:

sbt -J-Xdebug -J-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005

Bundan sonra localhost: 5005'te uzaktan hata ayıklamaya başlayabilirim


7

Buraya başka bir cevap ekliyorum, çünkü bu soruyu ilgili bir soruna bakarken buldum: Kesme noktaları kullanarak test sınıflarında hata ayıklama.

ScalaTest kullanıyorum ve genellikle sbt'nin 'yalnızca test' komutunu kullanarak bir paket çalıştırıyorum. Artık etkileşimli hata ayıklayıcıyı kullanmak istediğimde, aşağıdakileri yapabilirim:

'ScalaTest' türünde yeni bir Çalıştır / Hata Ayıklama Yapılandırması oluşturun, ana "Test Sınıfı:" adını girin ve "Başlatmadan önce: SBT Eylemini Çalıştır 'test-derleme" yi seçin. İşte bu, şimdi test kaynaklarına kesme noktaları yerleştirebilir ve bu yapılandırmayı çalıştırabilirsiniz.


aynı, ancak iyi çalışmıyor: stackoverflow.com/questions/16337745/…
ses

Test Sınıfında birden fazla test varsa yalnızca bir testi nasıl çalıştırabileceğimi biliyor musunuz? Lütfen şu soruya bakar mısınız stackoverflow.com/questions/54977741/…
Manu Chadha

7

Bu cevapların veya sağlanan bağlantıların hiçbiri benim için işe yaramadı, bu yüzden bunu bir kez anladığımda, paylaşacağımı düşündüm ...

buna başladığım zaman sahip olmadığım arka plan anlayışı dahil ...

Bu, çoğunlukla talimatlara dayanmaktadır burada sadece beni taşınan ek açıklama ile.

Ortamım: Scala 2.10.2, SBT 0.13 ve IntelliJ 13.1

Arka fon:

  • Her ne sebeple olursa olsun, IntelliJ'de Scala'yı derlemek için SBT kullanmak, Maven projelerinin olduğu gibi entegre değildir (hata ayıklamaya gerçekten kolayca izin verir).
  • Anladığım kadarıyla SBT ile derlerken ayrı bir süreçte derleme yapıyorsunuz, bu nedenle uzaktan hata ayıklama yapmanız gerekiyor.

Hata Ayıklama nedir?

  • Hata ayıklama, JVM'nizi veya uygulamanızı çalıştırabileceğiniz ve kod yürütme akışını kontrol etmenizi sağlayan bir moddur.
  • Kullandığınız Hata Ayıklama Aracı daha sonra Hata Ayıklama Motoruna "sonraki kod satırını çalıştırıp tekrar duraklatın" veya "yürütmeye devam et" veya "burada bellekte depolanan değişkenin değerini al" komutlarını verebilir.

Uzaktan Hata Ayıklama nedir?

  • Uzaktan Hata Ayıklama, bir ağ bağlantısı (soket) üzerinden hata ayıklamaktır.
  • Bu ağ bağlantısı, uzak bir makineden Hata Ayıklama Motoruna komutlar vermenize olanak sağlar.
  • Bu, uzak bir sunucuda çalışan kodda hata ayıklamak istediğinizde kullanışlıdır, AMA
  • SBT altında çalışan ve IntelliJ ortamınızdan ayrı olarak Jetty veya Tomcat gibi bir web sunucusu aracılığıyla başlatılan Scala kodu gibi durumlar için de kullanışlıdır.

Yukarıdaki bağlantıya atıfta bulunarak, aşağıdaki açıklamalar / değişiklikler faydalıdır:

  1. Ağ soketini kurarken kullanılacak bağlantı noktası da dahil olmak üzere, "hata ayıklamayı etkinleştir" JVM ayarlarıyla SBT'yi başlatmak için IntelliJ'i kurun. (değişmedi) adlandırılmış VM parametrelerini IntelliJ ayarlarınıza ekleyin.
  2. Buradaki bağlantı noktası numaranızın Adım 1'deki JVM ayarlarınızla eşleştiğinden emin olun.
  3. SBT'yi başlattığınızda, bunu SBT Konsol eklentisinden yapmanız gerekir (Adım 1'de yapılandırdığınız şey budur). SBT'yi IntelliJ dışında (komut satırında) çalıştırıyorsanız, SBT'yi Adım 1'deki aynı VM parametreleriyle başlatmanız gerekir (bunu ben yapmadım; yani talimat yok). Bu adımdan sonra SBT şimdi çalışıyor (ancak kodunuz henüz değil) ve JVM, Uzaktan Hata Ayıklama için ayarlandı.
  4. Bu, 3. Adımda başlattığınız JVM'ye bağlanan IntelliJ Hata Ayıklama Aracını başlatır.
  5. Son olarak, derlemeyi SBT Konsolunda başlatırsınız. Bunu, sürekli derleme komutu dahil herhangi bir derleme komutuyla yapabilirsiniz. Sürekli yeniden derleme yapılıyorsa, yeniden derleme gerçekleşir, ancak kod yürütme hata ayıklayıcı tarafından duraklatıldığında gerçekleşmez.

4
bağlantı koptu.
Andrew Bucknell

4

Intellij kullanarak SBT aracılığıyla oluşturulan bir Spray-can / Akka / Scala uygulamasıyla Windows'ta da hata ayıklama konusunda mücadele ediyorum. Çeşitli önerileri bir araya getirerek benim için en basit yaklaşım şuydu:

  1. Proje / plugsin.sbt dosyanızda sbt.Revolver'ın bulunduğundan emin olun örn.

    addSbtPlugin ("io.spray"% "sbt-revolver"% "0.7.1")

  2. Build.sbt dosyanızda javaoptions ayarlayın:

    javaOptions: = Seq ("- Xdebug", "-Xrunjdwp: transport = dt_socket, server = y, suspend = y, adres = 5005")

Özellikle suspend = y seçeneğini kullanın. Bu, Intellij'den bir uzaktan hata ayıklayıcı bağlayana kadar uygulamayı tutacaktır.

  1. Yapılandırmaları Çalıştır / Düzenle menüsü aracılığıyla Intellij'de bir hata ayıklayıcı yapılandırması ayarlayın. + Düğmesine basın, "Uzaktan" seçeneğini seçin. Girişlerin yukarıdaki java seçenekleriyle, özellikle de 5005 bağlantı noktası adresiyle eşleştiğinden emin olun. Yapılandırmaya 'Püskürtme' gibi bir ad verin.

  2. SBT konsolunuzdan yeniden başlatma komutunu kullanın. Geri bildirim çıktısında 5005 bağlantı noktası adresini görmelisiniz.

  3. Intellij'de kesme noktalarınızı ayarlayın.

  4. Intellij'den Run \ Debug 'Spray'i seçin. Bu, sprey kutusu web sunucusuna bağlanmalıdır. Hata ayıklama penceresinde çok sayıda iş parçacığı görebilmeniz gerekir.

  5. Spray'deki bazı Get yönergelerinin başlangıçta yürütüldüğüne, ancak web sitesini aradığınızda tekrar tekrar uygulanmadığına dikkat edin.


bu cevap için sizi korusun! çekicilik gibi çalıştı.
user2770362


3

Windows halkının değeri ne %SBT_HOME%\bin\sbt.batolursa olsun, aşağıdaki kod satırlarını düzenleyin ve bulun:

:run

"%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%sbt-launch.jar" xsbt.boot.Boot %*
if ERRORLEVEL 1 goto error
goto end

sonra bunları şu kodla değiştirin:

FOR %%a IN (%*) DO (
  if "%%a" == "-jvm-debug" (
    set JVM_DEBUG=true
    set /a JVM_DEBUG_PORT=5005 2>nul >nul
  ) else if "!JVM_DEBUG!" == "true" (
    set /a JVM_DEBUG_PORT=%%a 2>nul >nul
    if not "%%a" == "!JVM_DEBUG_PORT!" (
      set SBT_ARGS=!SBT_ARGS! %%a
    )
  ) else (
    set SBT_ARGS=!SBT_ARGS! %%a
  )
)

if defined JVM_DEBUG_PORT (
  set _JAVA_OPTS=!_JAVA_OPTS! -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=!JVM_DEBUG_PORT!
)

call :run %SBT_ARGS%

if ERRORLEVEL 1 goto error
goto end

:run
"%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%sbt-launch.jar" xsbt.boot.Boot %*
goto :eof

Aynı davranışı elde etmek için yapabileceğim en iyi şey -jvm-debugBash komut dosyası başlatıcısında görüldüğünde

NB. %SBT_HOME%Çevrenizde açıkça yaratmadıkça, aslında bu betiğin dışında var olduğunu sanmıyorum , ama yine de anlıyorsunuz: D


1
Çekme isteği birleştirildi
Darren Bishop

3

Dosya-> Ayarlar-> Diğer Ayarlar-> SBT VM parametreleri -Xmx512M -XX: MaxPermSize = 256M -Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, adres = 5005

Çalıştır-> Konfigürasyonları Düzenle + 'ya basın ve ardından uzaktan seçin Uygula'ya basın

Şimdi SBT konsolunda (IntelliJ tarafından başlatıldı) 'çalıştır' komutunu çalıştırdığınızda "5005 adresinde taşıma dt_socket için dinleme" göreceksiniz.

Şimdi Çalıştır-> Hata Ayıkla'ya basın. Aşağıdaki hata ayıklama menülerinin etkinleştirildiğini göreceksiniz. Debugger ve Console olmak üzere iki sekmesi vardır.

Sonraki satırdan sonrakine geçmek için F7'yi kullanın

Askıya almayı n olarak seçtim. Çalıştır komutunu çalıştırdığımda y olmasıyla sıkıştı


1
export SBT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5009

bunu dene


0

Ben de aynı sorunu yaşadım, nasıl çözdüğümü paylaşmayı seviyorum. Bu arada Ubuntu 14.04 ve IntelliJ 15 kullanıyorum.

  1. Ayar -> SBT -> VM Parametreleri metin kutusunda aşağıdaki satırın altına yapıştırıldı:

    -XX: MaxPermSize = 384M -Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, adres = 5005

  2. IntelliJ'de Termilal'i açıp çalıştırın:

    sbt -jvm-hata ayıklama 5005

    Not: Bu satırı terminalde görmelisiniz: "5005 adresinde dt_socket taşıma için dinleme"

  3. Yapılandırmaları Düzenle -> + -> 'Uzaktan' öğesini seçin

    I. Give some name example: DebugMyModule
    
    II. All needed configurations will be set automatically, But you just verify. In Command line arguments should look like this "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005".
    
    III. In 'Search Sources in Module's Classpath' text box specify your module in which module your test cases are there.
    
    IV. put 127.0.0.1 host instead of 'localhost'. 'localhost' not working for me.
  4. Seç DebugMyModule içinde Edit Configurationsliste kutusu ve tıklayın Debug .

    Not: Hata Ayıklama Görünümünün açıldığını ve Hata Ayıklama Konsolunda görmelisiniz "Hedef sanal makineye bağlı, adres:, '127.0.0.1:5005'taşıma: 'soket'"

  5. Test sınıfınızda birkaç test senaryosuna kesme noktaları koyun.

  6. " sbt -jvm-debug 5005" Koştuğunuz Terminale gelin ve aşağıdaki gibi koşun

    project <your-module-name>
    it:testOnly package.TestSpec

    Örneğin: com.myproject.module.AddServiceTest [Spec]

  7. Test durumu kesme noktanızda hata ayıklamanın başladığını görebilirsiniz.


Ubuntu 16.04 ve IntelliJ 2017.3 ile çalışmaz, hata ayıklayıcı eklenir ancak kesme noktaları göz ardı edilir.
Jonathan Neufeld

testSuite, kesme noktasında duramaz, ancak kesme noktası ana yöntemdeyse, olabilir.
shengshan zhang

0

AttachMe IntelliJ eklentisi, bağlantı noktası numaralarıyla uğraşmak zorunda kalmadan hata ayıklayıcıyı eklemenin potansiyel olarak daha hızlı yoludur:

AttachMe, uygulamanızı terminalden (veya başka bir yoldan) başlatsanız bile IntelliJ hata ayıklayıcısını otomatik olarak ekler . Attach to processİşlemi manuel olarak tetiklemenize gerek yoktur .

Blog gönderisinde ve benioku dosyasında kurulum talimatları var, ancak makinemde çalışmasını sağlamak için bunları biraz değiştirmem gerekti

  1. installer.shKomut dosyasını resmi depodan indirin

    curl -o installer.shhttps://raw.githubusercontent.com/JetBrains/attachme/master/installer.sh
  2. Çalıştırılabilir izinler verin chmod u+x installer.sh
  3. İle çalıştırın ./installer.sh
  4. Bu, aracıyı altına yüklemeli /.config/attachme/agent.jarve ~/.attachmedosya oluşturmalıdır
  5. İçermek ~/.attachmeiçin değiştirin

    AM_JDWP_ARGS="transport=dt_socket,server=y,suspend=y,address=127.0.0.1:0"
    echo Using JDWP arguments ${AM_JDWP_ARGS}
    export JAVA_TOOL_OPTIONS="- javaagent:/Users/mario_galic/.config/attachme/agent.jar -agentlib:jdwp=${AM_JDWP_ARGS}"
    echo "AttachMe configured successfully"
  6. İlgili Attachme eklentisini kurun ve yeniden başlatın: IntelliJ | Preferences | Plugins

  7. AttachmeÇalıştırma yapılandırması oluşturun :Run | Edit configurations... | Add new configuration | Attachme debugger registry | OK

Bu tek seferlik saçmalıklardan sonra, otomatik olarak bir hata ayıklayıcı ekleyebiliriz:

  1. AttachmeYapılandırmayı çalıştırmaya başlayın
  2. source ~/.attachme
  3. Uygulamayı terminalden başlatın, belki, sbt "runMain example.Hello"
  4. Hata ayıklayıcı, herhangi bir kesme noktasında otomatik olarak eklenmeli ve durmalıdır

-1

Roberto Tyley'in yukarıdaki cevabına göre, ancak Windows'ta sbt'yi kurduktan sonra aşağıdaki ortam değişkenlerini de ayarlamamız gerekiyor:

SBT_HOME
C: \ Program Files (x86) \ sbt \
[veya sbt'nin yüklü olduğu her yerde]

SBT_OPTS
-Xdebug -runjdwp: taşıma = dt_socket, sunucu = y, askıya alma = n, adres = 5005

[RT'nin IntelliJ örneğine göre]

Yola ekle:% SBT_HOME% \ bin;% SBT_OPTS%

Ardından, proje klasörü "sbt run -jvm -debug 5005" içindeki komut satırında aşağıdakileri çalıştırın.

Bu düzgün çalışıyorsa, komut satırı başlangıçta "5005 adresinde taşıma dt_socket için dinleme" satırını verir.

IntelliJ'de kesme noktası ayarlayın.

Hata ayıklayıcı kesme noktasını tetiklemek için web sitesini tarayıcıda açın, örneğin " http: // localhost: 9000 / ".

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.