Gỡ lỗi mã Scala bằng công cụ xây dựng đơn giản (sbt) và IntelliJ


120

Cách dễ nhất để gỡ lỗi mã Scala được quản lý bởi sbt bằng cách sử dụng trình gỡ lỗi tích hợp sẵn của IntelliJ là gì? Tài liệu từ "RunningSbt" từ trang web mã google của sbt liệt kê các lệnh để chạy lớp chính cho một dự án hoặc các bài kiểm tra, nhưng dường như không có lệnh nào để gỡ lỗi.

Câu hỏi tiếp theo: cách dễ nhất để đính kèm trình gỡ lỗi của IntelliJ vào Jetty khi sử dụng lệnh jetty-run của sbt là gì?


6
Xin đừng trộn lẫn các câu hỏi trong tương lai
hennr

Câu trả lời:


47

Đối với gỡ lỗi thông thường trong IntelliJ, bạn có thể sử dụng cấu hình chạy / gỡ lỗi Ứng dụng theo cách thông thường, bất kể bạn có đang sử dụng sbt để biên dịch mã của mình hay không.

Để kết nối với ứng dụng của bạn đang chạy trong Jetty, bạn cần tạo cấu hình gỡ lỗi Từ xa. Khi bạn làm như vậy, IntelliJ sẽ cung cấp cho bạn một tập hợp các đối số dòng lệnh để chạy JVM từ xa - giống như

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

Khởi chạy sbt với các đối số này và sau đó thực thi jetty-run. Cuối cùng, khởi chạy cấu hình gỡ lỗi từ xa của bạn trong IntelliJ. Chủ đề này có thể hữu ích.


1
đối với tôi Theo cách thông thường, nó không hoạt động tốt: stackoverflow.com/questions/16337745/…
ses

Bạn gõ cái này ở đâu? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
Jwan622,

@ Jwan622 Khởi chạy sbt với các đối số đó (ví dụ: từ dòng lệnh, cung cấp chúng dưới dạng đối số dòng lệnh). Sau đó thực hiện jetty-runtại dấu nhắc sbt.
Aaron Novstrup

vậy chỉ cần chạy sbt -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005?
Jwan622,

3
Đối với hầu hết người dùng, nó sẽ hoạt động, nhưng nó phụ thuộc vào cách sbt được thiết lập trên hệ thống của bạn. Như đã lưu ý trong câu trả lời khác, bạn có thể chỉ cần chạy sbt -jvm-debug 5005.
Aaron Novstrup

189

Có một -jvm-debuglá cờ rất tiện lợi trong các gói SBT chính thức dành cho Mac, Linux và Windows . Bạn có thể sử dụng cờ để chỉ định cổng gỡ lỗi:

sbt -jvm-debug 5005

Dưới các trang bìa , điều này bắt đầu JVM cho SBT với câu thần chú gỡ lỗi dài dòng điển hình:

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

Bây giờ bạn có thể chạy mã của mình như bình thường, chẳng hạn với runlệnh sbt .

Định cấu hình IntelliJ để kết nối với mã đang chạy ...

Bây giờ bạn kết nối IntelliJ với quy trình đang chạy của mình bằng cấu hình Gỡ lỗi từ xa . Lưu ý rằng 3 trường phía trên trong biểu mẫu này, trong khi đáng sợ, chỉ để bạn sao chép văn bản ra ngoài , chứ không phải vào (chúng đưa ra câu thần chú gỡ lỗi dài dòng được chỉ định ở trên, điều này -jvm-debugđã lo cho bạn) - cấu hình duy nhất bạn có thể thay đổi ở Settingsphần nửa dưới:

Cấu hình gỡ lỗi từ xa trong IntelliJ


1
Điều này không hoạt động trên Windows - bất kỳ ý tưởng nào về cách làm tương tự trên nền tảng (tệ hại) này?
javadba

Đây là tập lệnh trình khởi chạy mà tôi tin rằng được sử dụng cho Windows: github.com/sbt/sbt-launcher-package/blob/master/src/windows/sbt . Tôi khuyến khích bạn tìm ra cách sửa đổi tập lệnh để chấp nhận -jvm-debugtham số và gửi nó dưới dạng một yêu cầu kéo - bạn có cơ hội tốt để mang lại lợi ích cho tất cả những người thấy mình trên cùng một nền tảng.
Roberto Tyley

Nhìn vào nó. Tập lệnh khởi chạy windows là WAY nguyên thủy so với linux. Không thể làm bây giờ.
javadba

1
Yêu cầu kéo đã hợp nhất ... xem bên dưới
Darren Bishop

3
Nó sẽ rất hữu ích để biết được nơi để chèn "SBT -jvm 5005" trong IntelliJ
eddy147

39

Tôi cũng gặp một số rắc rối với điều này, vì vậy có nguy cơ bị chi tiết quá mức, đây là những gì tôi đã làm:

THIẾT LẬP

  1. Tạo cấu hình chạy cho cầu tàu sbt-run

    • Đi tới Chạy> Chỉnh sửa Cấu hình
    • Nhấp vào biểu tượng [+] và chọn Máy chủ biên dịch Scala
    • Nhập bất kỳ tên nào bạn muốn và nhấp vào hộp kiểm "Chạy Hành động SBT" và chọn cầu tàu Hành động SBT chạy từ [...]
  2. Tạo cấu hình gỡ lỗi để gỡ lỗi từ xa

    • Đi tới Chạy> Chỉnh sửa Cấu hình
    • Nhấp vào biểu tượng [+] và chọn Điều khiển từ xa
    • Nhập bất kỳ tên nào bạn muốn và sao chép dòng -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005(đảm bảo nhấp vào OK để thực sự tạo cấu hình)
  3. Thiết lập plugin sbt để chạy các tùy chọn vm ở trên

    • Đi tới Tệp> Cài đặt> SBT
    • Dán dòng -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005vào hộp tham số VM, sau những dòng đã có ở đó

NỢ

  1. Đặt các điểm ngắt như mong muốn
  2. Khởi động máy chủ web cầu cảng bằng cách chọn cấu hình chạy cầu tàu sbt mà bạn đã tạo ở trên và chọn Chạy> Chạy hoặc bằng cách nhấp vào mũi tên màu xanh lá cây
  3. Khởi động trình gỡ lỗi từ xa bằng cách chọn cấu hình gỡ lỗi từ xa bạn đã tạo ở trên và chọn Chạy> Gỡ lỗi hoặc bằng cách nhấp vào biểu tượng lỗi

16
không có Máy chủ biên dịch Scala trong Trình đơn cấu hình. Vì vậy, tôi có cần một cái gì đó đặc biệt?
Arne

Có vẻ như bước1 là không bắt buộc, những gì tôi làm là chạy lệnh sbt -jvm-debug 5005 consolesbt, sau đó đặt breakpoint trong intelllJ Idea, chạy gỡ lỗi.
Pengfei.X

@ Pengfei.X, sbt -jvm-debug 5005 consolekhông làm việc cho tôi, nhưng sbt -jvm-debug 5005đã làm.
Lukasz Czerwinski

8

Điều này phù hợp với tôi mọi lúc và điều duy nhất bạn cần thiết lập là gỡ lỗi từ xa trong IntelliJ; Tôi khởi động SBT với các thông số JVM từ thiết bị đầu cuối trong IntelliJ:

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

Sau đó, tôi có thể bắt đầu gỡ lỗi từ xa trên localhost: 5005


7

Tôi đang thêm một câu trả lời khác ở đây, vì tôi đã tìm thấy câu hỏi này khi tìm kiếm một vấn đề liên quan: Gỡ lỗi các lớp kiểm tra bằng cách sử dụng điểm ngắt.

Tôi đang sử dụng ScalaTest và tôi thường chạy một bộ ứng dụng bằng lệnh 'chỉ kiểm tra' của sbt. Bây giờ khi tôi muốn sử dụng trình gỡ lỗi tương tác, tôi có thể làm như sau:

Tạo cấu hình Run / Debug mới thuộc loại 'ScalaTest', đặt tên chính "Test Class:" và chọn "Trước khi khởi chạy: Chạy SBT Action 'test-compile'". Vậy là xong, bạn có thể đặt các điểm ngắt ngay bây giờ trong các nguồn thử nghiệm và chạy cấu hình này.


giống nhau, nhưng không hoạt động tốt: stackoverflow.com/questions/16337745/…
ses

bạn có biết làm cách nào để tôi chỉ có thể chạy một bài kiểm tra nếu Lớp kiểm tra có nhiều bài kiểm tra không? Bạn có thể vui lòng xem câu hỏi sau stackoverflow.com/questions/54977741/…
Manu Chadha

7

Không có câu trả lời nào trong số này hoặc các liên kết được cung cấp phù hợp với tôi, vì vậy khi tôi tìm ra điều này, tôi nghĩ rằng tôi sẽ chia sẻ ...

bao gồm cả kiến ​​thức cơ bản mà tôi không có khi bắt đầu ...

Điều này chủ yếu dựa trên các hướng dẫn ở đây chỉ với giải thích bổ sung đã giúp tôi vượt qua nó.

Môi trường của tôi: Scala 2.10.2, SBT 0.13 và IntelliJ 13.1

Lý lịch:

  • Vì bất kỳ lý do gì, việc sử dụng SBT để biên dịch Scala trong IntelliJ không được tích hợp theo cách của các dự án Maven (cho phép gỡ lỗi thực sự dễ dàng).
  • Tôi hiểu rằng khi biên dịch với SBT, bạn đang biên dịch trong một quy trình riêng biệt, do đó, bạn cần gỡ lỗi từ xa.

Gỡ lỗi là gì?

  • Gỡ lỗi là một chế độ bạn có thể chạy JVM hoặc ứng dụng của mình, cho phép bạn kiểm soát luồng thực thi mã.
  • Sau đó, Công cụ gỡ lỗi bạn sử dụng có thể đưa ra các lệnh cho Công cụ gỡ lỗi để thông báo cho nó "thực thi dòng mã tiếp theo rồi tạm dừng lại" hoặc "tiếp tục thực thi" hoặc "lấy giá trị của biến được lưu trữ tại đây trong bộ nhớ".

Gỡ lỗi từ xa là gì?

  • Gỡ lỗi từ xa là gỡ lỗi qua kết nối mạng (ổ cắm).
  • Kết nối mạng này cho phép bạn đưa ra các lệnh tới Debug Engine từ một máy từ xa.
  • Điều này hữu ích khi bạn muốn gỡ lỗi mã đang chạy trên máy chủ từ xa, NHƯNG
  • Nó cũng hữu ích cho các trường hợp như mã Scala chạy dưới SBT và khởi chạy qua máy chủ web, chẳng hạn như Jetty hoặc Tomcat, tách biệt với môi trường IntelliJ của bạn.

Tham khảo liên kết ở trên, các giải thích / sửa đổi sau đây rất hữu ích:

  1. Thiết lập IntelliJ để khởi chạy SBT với cài đặt JVM "bật gỡ lỗi", bao gồm cả cổng để sử dụng khi thiết lập ổ cắm mạng. (không thay đổi) thêm các tham số VM được đặt tên vào cài đặt IntelliJ của bạn.
  2. Đảm bảo số cổng của bạn ở đây khớp với cài đặt JVM của bạn từ Bước 1.
  3. Khi bạn khởi chạy SBT, bạn cần thực hiện việc đó từ plugin SBT Console (chính là những gì bạn đã định cấu hình ở Bước 1). Nếu bạn đang chạy SBT bên ngoài IntelliJ (tại dòng lệnh), bạn sẽ cần khởi chạy SBT với cùng các thông số VM từ Bước 1 (Tôi đã không làm điều này; vì vậy không có hướng dẫn). Sau bước này, SBT hiện đang chạy (nhưng mã của bạn vẫn chưa) và JVM được thiết lập để Gỡ lỗi từ xa.
  4. Thao tác này khởi động Công cụ gỡ lỗi IntelliJ, công cụ này kết nối với JVM mà bạn đã bắt đầu ở Bước 3.
  5. Cuối cùng, bạn bắt đầu biên dịch trong SBT Console. Bạn có thể thực hiện việc này với bất kỳ lệnh biên dịch nào, bao gồm cả lệnh biên dịch liên tục. Nếu biên dịch lại liên tục, quá trình biên dịch lại sẽ xảy ra, nhưng không phải trong khi trình gỡ lỗi tạm dừng việc thực thi mã.

4
liên kết bị hỏng.
Andrew Bucknell

4

Tôi cũng đang gặp khó khăn với việc gỡ lỗi trên Windows với ứng dụng Spray-can / Akka / Scala được xây dựng qua SBT, sử dụng Intellij. Tổng hợp các đề xuất khác nhau, cách tiếp cận đơn giản nhất đối với tôi là:

  1. Đảm bảo rằng bạn có sbt.Revolver trong tệp dự án / plugsin.sbt của bạn, ví dụ:

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

  2. Đặt javaoptions trong tệp build.sbt của bạn:

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

Đặc biệt, hãy sử dụng tùy chọn pause = y. Thao tác này sẽ giữ ứng dụng cho đến khi bạn kết nối trình gỡ lỗi từ xa từ Intellij

  1. Thiết lập cấu hình trình gỡ lỗi trong Intellij thông qua menu Run / Edit Configurations. Nhấn nút +, chọn tùy chọn "Từ xa". Đảm bảo rằng các mục nhập khớp với javaoptions ở trên, đặc biệt là địa chỉ cổng của 5005. Đặt tên cho cấu hình như 'Spray'.

  2. Từ bảng điều khiển SBT của bạn, sử dụng lệnh khởi động lại. Bạn sẽ thấy địa chỉ cổng 5005 trong đầu ra phản hồi.

  3. Trong Intellij thiết lập các điểm ngắt của bạn.

  4. Từ Intellij, chọn Run \ Debug 'Spray'. Điều này sẽ kết nối với máy chủ web bình xịt. Bạn sẽ có thể thấy nhiều luồng trong cửa sổ gỡ lỗi.

  5. Lưu ý rằng một số lệnh Get trong Spray dường như được thực thi khi khởi động nhưng không liên tục khi gọi trang web.


chúc phúc cho bạn cho câu trả lời này! hoạt động như một sự quyến rũ.
user2770362


3

Đối với những gì nó đáng giá trong Windows, hãy chỉnh sửa %SBT_HOME%\bin\sbt.batvà định vị các dòng mã sau:

:run

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

sau đó thay thế chúng bằng mã này:

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

Điều tốt nhất tôi có thể làm để có được hành vi tương tự -jvm-debugkhi được nhìn thấy trong trình khởi chạy tập lệnh Bash

NB. Tôi không nghĩ rằng %SBT_HOME%thực sự tồn tại bên ngoài tập lệnh này, trừ khi bạn đã tạo rõ ràng trong môi trường của mình, nhưng dù sao thì bạn cũng hiểu: D


1
Yêu cầu kéo đã được hợp nhất
Darren Bishop

3

Tệp-> Cài đặt-> Cài đặt khác-> Thông số SBT VM -Xmx512M -XX: MaxPermSize = 256M -Xdebug -Xrunjdwp: transport = dt_socket, server = y, pause = n, address = 5005

Chạy-> Chỉnh sửa cấu hình Nhấn + rồi chọn từ xa Nhấn Áp dụng

Bây giờ trong bảng điều khiển SBT (Khởi động bên trong bởi intelliJ) khi bạn thực hiện lệnh 'run' Bạn sẽ thấy "Đang lắng nghe cho truyền tải dt_socket tại địa chỉ: 5005"

Bây giờ nhấn Run-> Debug. Bạn sẽ thấy các menu gỡ lỗi bên dưới được kích hoạt. Nó có hai tab Debugger và Console.

Sử dụng F7 để từ dòng tiếp theo sang dòng tiếp theo

Tôi đã chọn đình chỉ là n. Với nó là y khi tôi chạy lệnh chạy nó bị kẹt


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

thử cái này


0

Tôi cũng gặp vấn đề tương tự, tôi muốn chia sẻ cách tôi đã giải quyết. Nhân tiện, tôi đang sử dụng Ubuntu 14.04 và IntelliJ 15.

  1. Trong Cài đặt -> SBT -> Đã dán dòng bên dưới trong hộp văn bản Tham số VM:

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

  2. Đã mở Termilal trong IntelliJ và chạy:

    sbt -jvm-debug 5005

    Lưu ý: bạn sẽ thấy dòng này trong thiết bị đầu cuối: "Đang lắng nghe cho dt_socket giao thông tại địa chỉ: 5005"

  3. Chỉnh sửa cấu hình -> Nhấp vào + -> Chọn 'Điều khiển từ xa'

    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. Chọn DebugMyModule trong Edit Configurationshộp danh sách và nhấp vào Debug .

    Lưu ý: Bạn sẽ thấy Chế độ xem gỡ lỗi được mở và trong Bảng điều khiển gỡ lỗi Bạn sẽ có thể thấy "Đã kết nối với máy ảo đích, địa chỉ '127.0.0.1:5005':, transport: 'socket'"

  5. Đặt các điểm ngắt trong một vài trường hợp thử nghiệm trong Lớp kiểm thử của bạn.

  6. Đến Terminal nơi bạn chạy " sbt -jvm-debug 5005" và chạy như bên dưới

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

    Ví dụ: com.myproject.module.AddServiceTest [Spec]

  7. Bạn có thể thấy gỡ lỗi đã bắt đầu trong điểm ngắt trường hợp thử nghiệm của mình.


Không hoạt động với Ubuntu 16.04 và IntelliJ 2017.3, trình gỡ lỗi đính kèm nhưng các điểm ngắt bị bỏ qua.
Jonathan Neufeld,

testSuite không thể dừng lại ở breakpoint, tuy nhiên nếu breakpoint nằm trong một phương thức chính, nó có thể.
shengshan zhang

0

Plugin AttachMe IntelliJ có khả năng nhanh hơn để đính kèm trình gỡ lỗi mà không phải loay hoay với số cổng:

AttachMe sẽ tự động đính kèm trình gỡ lỗi IntelliJ ngay cả khi bạn khởi động ứng dụng của mình từ thiết bị đầu cuối (hoặc bất kỳ cách nào khác). Bạn không cần phải kích hoạt Attach to processhành động theo cách thủ công.

Bài đăng trên blogreadme có hướng dẫn thiết lập, tuy nhiên tôi phải thay đổi chúng một chút để nó hoạt động trên máy của tôi

  1. Tải xuống installer.shscript từ repo chính thức

    curl -o installer.shhttps://raw.githubusercontent.com/JetBrains/attachme/master/installer.sh
  2. Cấp cho nó quyền thực thi chmod u+x installer.sh
  3. Chạy nó với ./installer.sh
  4. Điều này sẽ cài đặt tác nhân theo /.config/attachme/agent.jarvà tạo ~/.attachmetệp
  5. Sửa đổi ~/.attachmeđể chứa

    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. Cài đặt plugin Attachme tương ứng và khởi động lại: IntelliJ | Preferences | Plugins

  7. Tạo Attachmecấu hình chạy:Run | Edit configurations... | Add new configuration | Attachme debugger registry | OK

Sau những trò tai quái này, chúng tôi có thể tự động đính kèm trình gỡ lỗi bằng cách

  1. Bắt đầu Attachmechạy cấu hình
  2. source ~/.attachme
  3. Bắt đầu ứng dụng từ thiết bị đầu cuối, có lẽ, sbt "runMain example.Hello"
  4. Trình gỡ lỗi sẽ tự động đính kèm và dừng lại ở bất kỳ điểm ngắt nào

-1

Theo câu trả lời của Roberto Tyley ở trên, nhưng trong Windows, chúng ta cũng cần đặt các biến môi trường sau khi cài đặt sbt:

SBT_HOME
C: \ Program Files (x86) \ sbt \
[hoặc bất cứ nơi nào sbt được cài đặt]

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

[theo ví dụ IntelliJ của RT]

Thêm vào đường dẫn:% SBT_HOME% \ bin;% SBT_OPTS%

Sau đó, chạy dòng lệnh sau trong thư mục dự án "sbt run -jvm -debug 5005".

Nếu điều này hoạt động bình thường, ban đầu dòng lệnh sẽ xuất ra một dòng là "Đang lắng nghe cho việc truyền tải dt_socket tại địa chỉ: 5005".

Đặt điểm ngắt trong IntelliJ.

Mở trang web trong trình duyệt để kích hoạt điểm ngắt của trình gỡ lỗi, ví dụ " http: // localhost: 9000 / ".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.