2013-12-13 18 views
10

Dấu vết ngăn xếp Scala nổi tiếng phức tạp, đặc biệt là do các hàm ẩn danh được dịch sang bytecode. Dưới đây là một ví dụ:Dấu vết ngăn xếp dấu vết "tốt hơn"

java.lang.IllegalStateException 
    at com.company.IdentityVerifier$$anonfun$go$2$$anonfun$apply$2.apply$mcII$sp(IdentityVerifier.scala:19) 
    at com.company.IdentityVerifier$$anonfun$go$2$$anonfun$apply$2.apply(IdentityVerifier.scala:17) 
    at com.company.IdentityVerifier$$anonfun$go$2$$anonfun$apply$2.apply(IdentityVerifier.scala:17) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) 
    at scala.collection.AbstractTraversable.map(Traversable.scala:105) 
    at com.company.IdentityVerifier$$anonfun$go$2.apply(IdentityVerifier.scala:17) 
    at com.company.IdentityVerifier$$anonfun$go$2.apply(IdentityVerifier.scala:16) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251) 
    at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105) 
    at com.company.IdentityVerifier$.go(IdentityVerifier.scala:16) 
    at com.company.UserMap.setLastUserId(UserMap.scala:12) 
    at com.company.UserConsumer.setCurrentUser(UserConsumer.java:69) 
    at com.company.UserConsumer.consume(UserConsumer.java:64) 
    at com.company.UserProducer.execute(UserProducer.java:19) 
    at com.company.UserCreator.execute(UserCreator.java:18) 
    at com.company.UserCreatorMain$1.run(UserCreatorMain.java:37) 
    at com.company.UserCreatorMain.main(UserCreatorMain.java:51) 

Tôi đã kể từ khi tìm thấy stackifier (đó là tấm gương của họ), nhưng nó cồng kềnh để giữ dán chồng dấu vết đến một trang web. Có cách nào để in dấu vết ngăn xếp "tốt hơn" trên bảng điều khiển không?

+0

Tổ hợp dấu vết ngăn xếp như thế nào? Nó cho bạn biết dòng nơi ngoại lệ đã xảy ra. – vptheron

+0

@vptheron Điểm của một dấu vết ngăn xếp không chỉ là để biết dòng nơi ngoại lệ đã xảy ra, mà còn * làm thế nào nó đã có *. "Phức tạp" chủ yếu là chủ quan - với tôi, '$ anonfun $ go $ 2 $$ anonfun $ áp dụng $ 2' không cho tôi biết bất kỳ thông tin hữu ích nào, cũng không làm 5 dòng dấu vết cho một' sơ đồ phẳng 'đơn giản. Mặc dù nó thực sự thú vị khi có một cái nhìn tại ruột của scala, hầu hết thời gian tôi chỉ muốn hiểu * những gì đã xảy ra *. Nhanh. – goncalopp

+3

Về mặt kỹ thuật, vấn đề với dấu vết ngăn xếp Scala này là nó không phải là một dấu vết ngăn xếp Scala, đó là một dấu vết ngăn xếp Java. Tuy nhiên, không giúp bạn. –

Trả lời

4

Intellij IDEA giúp, ngay cả trong trường hợp bạn không gỡ lỗi mã (và các plugin scala nên làm việc ngay cả với phiên bản cộng đồng):

http://www.jetbrains.com/idea/webhelp/analyzing-external-stacktraces.html

Bạn nhận được một stack trace có thể nhấp, nhảy đến đúng địa chỉ.

Tôi đã hỏi tại diễn đàn ScalaIDE cho dù ScalaIDE có thực hiện việc này hay không. Mirco Dotta ninja trả lời:

Có, nhưng nó không phải là tính năng đơn giản nhất để tìm trong Eclipse. Bạn cần phải open the "Java StackTrace Console"

Chưa được hỏi về emacs, ai đó xin vui lòng chip trong.

Ngoài ra, hãy cố gắng xem xét rằng "khó hiểu" tên (đi xem C++ tên mangling) là một mức giá bạn phải trả cho thêm tính linh hoạt.

Các vấn đề liên quan