Debugging kode Scala dengan simple-build-tool (sbt) dan IntelliJ

120

Apa cara termudah untuk men-debug kode Scala yang dikelola oleh sbt menggunakan debugger bawaan IntelliJ? Dokumentasi dari "RunningSbt" dari situs kode google sbt mencantumkan perintah untuk menjalankan kelas utama untuk suatu proyek atau pengujian, tetapi tampaknya tidak ada perintah untuk debugging.

Pertanyaan tindak lanjut: apa cara termudah untuk memasang debugger IntelliJ ke Jetty saat menggunakan perintah jetty-run sbt?

Matthew
sumber
6
Harap jangan mencampur pertanyaan di masa mendatang
hennr

Jawaban:

47

Untuk debugging biasa di IntelliJ, Anda dapat menggunakan konfigurasi run / debug Aplikasi dengan cara biasa, terlepas dari apakah Anda menggunakan sbt untuk mengompilasi kode Anda.

Untuk terhubung ke aplikasi Anda yang berjalan di Jetty, Anda harus membuat konfigurasi debug jarak jauh. Saat Anda melakukannya, IntelliJ akan memberi Anda sekumpulan argumen baris perintah untuk menjalankan JVM jarak jauh - seperti

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

Luncurkan sbt dengan argumen ini dan kemudian jalankan jetty-run. Terakhir, luncurkan konfigurasi debug jarak jauh Anda di IntelliJ. Utas ini mungkin berguna.

Aaron Novstrup
sumber
1
bagi saya Dalam cara biasa itu tidak berfungsi dengan baik: stackoverflow.com/questions/16337745/…
ses
Di mana Anda mengetik ini? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Jwan622
@ Jwan622 Luncurkan sbt dengan argumen tersebut (misalnya, dari baris perintah, yang menyediakannya sebagai argumen baris perintah). Kemudian jalankan jetty-rundi prompt sbt.
Aaron Novstrup
jadi lari saja sbt -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005?
Jwan622
3
Untuk sebagian besar pengguna yang seharusnya berfungsi, tetapi itu tergantung pada bagaimana sbt diatur di sistem Anda. Seperti yang disebutkan di jawaban lain, Anda mungkin bisa langsung lari sbt -jvm-debug 5005.
Aaron Novstrup
189

Ada tanda yang sangat nyaman -jvm-debugdi paket SBT resmi untuk Mac, Linux & Windows . Anda dapat menggunakan tanda tersebut untuk menentukan port debug:

sbt -jvm-debug 5005

Di bawah penutup , ini memulai JVM untuk SBT dengan mantra debugging verbose tipikal:

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

Anda sekarang dapat menjalankan kode Anda seperti biasa, misalnya dengan runperintah sbt .

Mengonfigurasi IntelliJ untuk menyambung ke kode yang sedang berjalan ...

Sekarang Anda menghubungkan IntelliJ ke proses yang sedang berjalan menggunakan konfigurasi Remote Debug . Perhatikan bahwa atas 3 bidang dalam formulir ini, sementara menakutkan, hanya untuk Anda untuk menyalin teks keluar dari, daripada ke (mereka memberikan verbose debug mantera tersebut di atas, yang -jvm-debugsudah mengurus untuk Anda) - hanya konfigurasi Anda dapat mengubah di Settingsbagian tengah ke bawah:

Konfigurasi Remote Debug di IntelliJ

Roberto Tyley
sumber
1
Ini tidak berfungsi pada Windows - ada ide bagaimana melakukan yang serupa pada platform (buruk) ini?
javadba
Ini adalah skrip peluncur yang saya yakini digunakan untuk Windows: github.com/sbt/sbt-launcher-package/blob/master/src/windows/sbt . Saya akan mendorong Anda untuk mencari cara bagaimana memodifikasi skrip untuk menerima -jvm-debugparameter, dan mengirimkannya sebagai permintaan tarik - Anda memiliki peluang bagus untuk menguntungkan semua orang yang menemukan diri mereka di platform yang sama.
Roberto Tyley
Aku memeriksanya. Skrip peluncuran windows adalah CARA primitif vs linux. Tidak bisa sekarang.
javadba
1
Permintaan tarik digabung ... lihat di bawah
Darren Bishop
3
Akan sangat membantu untuk mengetahui di mana menyisipkan "sbt -jvm 5005" di IntelliJ
eddy147
39

Saya juga mengalami masalah dengan ini, jadi dengan risiko menjadi terlalu detail, inilah yang saya lakukan:

MEMPERSIAPKAN

  1. Buat konfigurasi run untuk sbt jetty-run

    • Pergi ke Jalankan> Edit Konfigurasi
    • Klik ikon [+] dan pilih Scala Compilation Server
    • Masukkan nama apa pun yang Anda inginkan, dan klik kotak centang "Run SBT Action" dan pilih jetty-run SBT Action dari [...]
  2. Buat konfigurasi debug untuk debugging jarak jauh

    • Pergi ke Jalankan> Edit Konfigurasi
    • Klik ikon [+] dan pilih Remote
    • Masukkan nama apa pun yang Anda inginkan dan salin baris -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005(pastikan untuk mengklik OK untuk benar-benar membuat konfigurasi)
  3. Siapkan plugin sbt untuk menjalankan opsi vm di atas

    • Buka File> Pengaturan> SBT
    • Tempel baris -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005di kotak parameter VM, setelah yang sudah ada

DEBUGGING

  1. Tetapkan breakpoint sesuai keinginan
  2. Mulai server web jetty dengan memilih konfigurasi sbt jetty-run yang Anda buat di atas dan pilih Run> Run atau dengan mengklik panah hijau
  3. Mulai debugger jarak jauh dengan memilih konfigurasi debugging jarak jauh yang Anda buat di atas dan pilih Run> Debug atau dengan mengklik ikon bug
Jamie Forrest
sumber
16
tidak ada Server Kompilasi Scala di Menu Konfigurasi. Jadi, apakah saya membutuhkan sesuatu yang istimewa?
Arne
Sepertinya step1 tidak diperlukan, yang saya lakukan adalah menjalankan perintah sbt sbt -jvm-debug 5005 console, kemudian mengatur breakpoint di intelllJ Idea, jalankan debug.
Pengfei.X
@ Pengfei.X, sbt -jvm-debug 5005 consoletidak berhasil untuk saya, tetapi sbt -jvm-debug 5005berhasil.
Lukasz Czerwinski
8

Yang ini berfungsi untuk saya setiap saat, dan satu-satunya hal yang perlu Anda siapkan adalah debugging jarak jauh di IntelliJ; Saya memulai SBT dengan parameter JVM dari terminal di IntelliJ:

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

Setelah itu saya dapat memulai debugging jarak jauh di localhost: 5005

Erik Madsen
sumber
7

Saya menambahkan jawaban lain di sini, karena saya menemukan pertanyaan ini ketika mencari masalah terkait: Debugging tes kelas menggunakan breakpoints.

Saya menggunakan ScalaTest, dan saya biasanya menjalankan suite menggunakan perintah 'test-only' sbt. Sekarang ketika saya ingin menggunakan debugger interaktif, saya dapat melakukan hal berikut:

Buat Konfigurasi Run / Debug baru dengan tipe 'ScalaTest', masukkan nama "Test Class:" utama, dan pilih "Before launch: Run SBT Action 'test-compile'". Itu saja, Anda sekarang dapat menempatkan breakpoint di sumber pengujian, dan menjalankan konfigurasi ini.

0__
sumber
sama, tetapi tidak berfungsi dengan baik: stackoverflow.com/questions/16337745/…
ses
tahukah Anda bagaimana saya dapat menjalankan hanya satu pengujian jika Test Class memiliki beberapa pengujian? Bisakah Anda melihat pertanyaan berikut stackoverflow.com/questions/54977741/…
Manu Chadha
7

Tak satu pun dari jawaban atau tautan yang diberikan ini berhasil untuk saya, jadi setelah saya menemukan jawabannya, saya pikir saya akan membagikan ...

termasuk pemahaman latar belakang yang tidak saya miliki ketika saya mulai ...

Ini sebagian besar didasarkan pada instruksi di sini hanya dengan penjelasan tambahan yang membawa saya melewatinya.

Lingkungan Saya: Scala 2.10.2, SBT 0.13, dan IntelliJ 13.1

Latar Belakang:

  • Untuk alasan apa pun, menggunakan SBT untuk mengompilasi Scala di IntelliJ tidak terintegrasi seperti proyek Maven (yang memungkinkan proses debug dengan sangat mudah).
  • Tampak dari pemahaman saya bahwa ketika mengompilasi dengan SBT, Anda mengompilasi dalam proses terpisah, oleh karena itu, Anda perlu melakukan debug dari jarak jauh.

Apa itu Debugging?

  • Debugging adalah mode tempat Anda dapat menjalankan JVM atau aplikasi yang memungkinkan Anda mengontrol aliran eksekusi kode.
  • Alat Debugging yang Anda gunakan kemudian dapat mengeluarkan perintah ke Mesin Debugging yang memberitahukannya "jalankan baris kode berikutnya lalu jeda lagi" atau "lanjutkan menjalankan" atau "dapatkan nilai variabel yang disimpan di sini di memori".

Apa itu Debugging Jarak Jauh?

  • Debugging Jarak Jauh adalah debugging melalui koneksi jaringan (soket).
  • Koneksi jaringan ini memungkinkan Anda untuk mengeluarkan perintah ke Debug Engine dari mesin jarak jauh.
  • Ini berguna saat Anda ingin men-debug kode yang berjalan di server jarak jauh, TAPI
  • Ini juga berguna untuk situasi seperti kode Scala yang berjalan di bawah SBT dan diluncurkan melalui server web, seperti Jetty atau Tomcat, terpisah dari lingkungan IntelliJ Anda.

Mengacu pada tautan di atas, penjelasan / modifikasi berikut berguna:

  1. Atur IntelliJ untuk meluncurkan SBT dengan pengaturan JVM "aktifkan debugging", termasuk port yang akan digunakan saat menyiapkan soket jaringan. (tidak berubah) tambahkan parameter VM bernama ke pengaturan IntelliJ Anda.
  2. Pastikan nomor port Anda di sini cocok dengan pengaturan JVM Anda dari Langkah 1.
  3. Saat Anda meluncurkan SBT, Anda perlu melakukannya dari plugin Konsol SBT (yang Anda konfigurasikan pada Langkah 1). Jika Anda menjalankan SBT di luar IntelliJ (di commandline), Anda harus meluncurkan SBT dengan parameter VM yang sama dari Langkah 1 (Saya tidak melakukan ini; jadi tidak ada instruksi). Setelah langkah ini, SBT sekarang berjalan (tetapi kode Anda belum) dan JVM disiapkan untuk Debugging Jarak Jauh.
  4. Ini memulai Alat Debugging IntelliJ, yang terhubung ke JVM yang Anda mulai pada Langkah 3.
  5. Terakhir, Anda memulai kompilasi di Konsol SBT. Anda dapat melakukan ini dengan perintah kompilasi apa pun, termasuk perintah kompilasi berkelanjutan. Jika kompilasi ulang terus menerus, kompilasi ulang akan terjadi, tetapi tidak saat eksekusi kode dihentikan sementara oleh debugger.
Mike
sumber
4
link rusak.
Andrew Bucknell
4

Saya telah berjuang dengan debugging juga pada Windows dengan aplikasi Spray-can / Akka / Scala yang dibangun melalui SBT, menggunakan Intellij. Menyatukan berbagai saran, pendekatan paling sederhana bagi saya adalah:

  1. Pastikan Anda memiliki sbt.Revolver di file proyek / plugsin.sbt Anda, misalnya

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

  2. Setel opsi java di file build.sbt Anda:

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

Secara khusus gunakan opsi suspend = y. Ini akan menahan aplikasi sampai Anda menghubungkan debugger jarak jauh dari Intellij

  1. Siapkan konfigurasi debugger di Intellij melalui menu Run / Edit Configurations. Tekan tombol +, pilih opsi "Remote". Pastikan entri cocok dengan opsi java di atas, khususnya alamat port 5005. Beri nama konfigurasi seperti 'Spray'.

  2. Dari konsol SBT Anda, gunakan perintah re-start. Anda harus melihat alamat port 5005 di keluaran umpan balik.

  3. Di Intellij, atur breakpoint Anda.

  4. Dari Intellij, pilih Run \ Debug 'Spray'. Ini harus terhubung ke server web kaleng semprot. Anda seharusnya dapat melihat banyak utas di jendela debug.

  5. Berhati-hatilah karena beberapa petunjuk Dapatkan di Spray tampaknya dijalankan saat memulai tetapi tidak berulang kali saat memanggil situs web.

Herc
sumber
memberkati Anda untuk jawaban ini! bekerja seperti pesona.
pengguna2770362
3

Untuk apa itu Windows folk, edit %SBT_HOME%\bin\sbt.batdan temukan baris kode berikut:

:run

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

lalu gantilah dengan kode ini:

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

Yang terbaik yang bisa saya lakukan untuk mendapatkan perilaku yang sama -jvm-debug saat terlihat di peluncur skrip Bash

NB. Saya tidak berpikir %SBT_HOME%sebenarnya ada di luar skrip ini, kecuali Anda membuat secara eksplisit di lingkungan Anda, tetapi bagaimanapun Anda mengerti maksudnya: D

Darren Bishop
sumber
1
Permintaan tarik digabung
Darren Bishop
3

File-> Pengaturan-> Pengaturan Lain-> Parameter SBT VM -Xmx512M -XX: MaxPermSize = 256M -Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, address = 5005

Jalankan-> Edit Konfigurasi Tekan + lalu pilih remote Tekan Terapkan

Sekarang di konsol SBT (Dimulai di dalam oleh intelliJ) ketika Anda menjalankan perintah 'run' Anda akan melihat "Mendengarkan transportasi dt_socket di alamat: 5005"

Sekarang tekan Run-> Debug. Anda akan melihat menu debug di bawah ini diaktifkan. Ini memiliki dua tab Debugger dan Konsol.

Gunakan F7 untuk dari baris berikutnya ke baris berikutnya

Saya memilih suspend menjadi n. Dengan itu menjadi y ketika saya menjalankan perintah run itu macet

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

coba ini

shengshan zhang
sumber
0

Saya juga mendapat masalah yang sama, saya suka berbagi bagaimana saya menyelesaikannya. Omong-omong saya menggunakan Ubuntu 14.04 dan IntelliJ 15.

  1. Dalam Pengaturan -> SBT -> Disisipkan di bawah baris di kotak teks Parameter VM:

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

  2. Buka Termilal di IntelliJ dan jalankan:

    sbt -jvm-debug 5005

    Catatan: Anda akan melihat baris ini di terminal: "Mendengarkan transportasi dt_socket di alamat: 5005"

  3. Edit Konfigurasi -> Klik + -> Pilih 'Remote'

    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. Pilih DebugMyModule di Edit Configurationskotak daftar dan klik Debug .

    Catatan: Anda akan melihat Tampilan Debug dibuka dan di Konsol Debug Anda akan melihat "Tersambung ke VM target, alamat '127.0.0.1:5005':, transport: 'socket'"

  5. Tempatkan breakpoint dalam beberapa kasus pengujian di Testclass Anda.

  6. Datanglah ke Terminal tempat Anda menjalankan " sbt -jvm-debug 5005" dan berlari seperti di bawah ini

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

    Misalnya: com.myproject.module.AddServiceTest [Spec]

  7. Anda dapat melihat debug dimulai di breakpoint kasus pengujian Anda.

Matahari
sumber
Tidak berfungsi dengan Ubuntu 16.04 dan IntelliJ 2017.3, debugger terpasang tetapi breakpoint diabaikan.
Jonathan Neufeld
testSuite tidak bisa berhenti di breakpoint, namun jika breakpoint dalam metode utama, itu bisa.
shengshan zhang
0

Plugin AttachMe IntelliJ berpotensi lebih cepat dalam melampirkan debugger tanpa harus mengutak-atik nomor port:

AttachMe akan melampirkan debugger IntelliJ secara otomatis bahkan jika Anda memulai aplikasi dari terminal (atau cara lain). Anda tidak perlu memicuAttach to process tindakan secara manual.

Posting blog dan readme memiliki petunjuk penyiapan, namun saya harus mengubahnya sedikit agar dapat berfungsi di mesin saya

  1. Unduh installer.shskrip dari repo resmi

    curl -o installer.shhttps://raw.githubusercontent.com/JetBrains/attachme/master/installer.sh
  2. Berikan izin yang dapat dieksekusi chmod u+x installer.sh
  3. Jalankan dengan ./installer.sh
  4. Ini harus menginstal agen di bawah /.config/attachme/agent.jardan membuat~/.attachme file
  5. Ubah ~/.attachmeuntuk menampung

    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. Instal plugin Attachme yang sesuai dan mulai ulang: IntelliJ | Preferences | Plugins

  7. Buat Attachmekonfigurasi run:Run | Edit configurations... | Add new configuration | Attachme debugger registry | OK

Setelah kesalahan satu kali ini, kita dapat memasang debugger secara otomatis dengan

  1. Mulai Attachmejalankan konfigurasi
  2. source ~/.attachme
  3. Mulai aplikasi dari terminal, mungkin, sbt "runMain example.Hello"
  4. Debugger harus otomatis terpasang dan berhenti di breakpoint mana pun
Mario Galic
sumber
-1

Sesuai jawaban Roberto Tyley di atas, tetapi di Windows kita juga perlu mengatur variabel lingkungan berikut setelah menginstal sbt:

SBT_HOME
C: \ Program Files (x86) \ sbt \
[atau di mana pun sbt diinstal]

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

[per contoh IntelliJ RT]

Tambahkan ke jalur:% SBT_HOME% \ bin;% SBT_OPTS%

Kemudian jalankan perintah berikut pada baris perintah dalam folder proyek "sbt run -jvm -debug 5005".

Jika ini bekerja dengan benar, baris perintah awalnya akan menampilkan baris kembali "Mendengarkan transportasi dt_socket di alamat: 5005".

Setel breakpoint di IntelliJ.

Buka situs web di browser untuk memicu breakpoint debugger misalnya " http: // localhost: 9000 / ".

decdev2012
sumber