2013-12-13 76 views
10

斯卡拉堆棧跟蹤非常複雜,尤其是因爲匿名函數被轉換爲字節碼的方式。這裏有一個例子:「更好」的斯卡拉堆棧跟蹤

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) 

因爲我已經發現stackifier(這是他們的例子),但它的繁瑣,以保持粘貼堆棧跟蹤到的網頁。有沒有辦法在控制檯上打印「更好」的堆棧軌跡?

+0

堆棧跟蹤如何複雜?它會告訴你發生異常的地方。 – vptheron

+0

@vptheron堆棧跟蹤的要點不僅在於知道異常發生的地方,而且還知道它如何到達那裏*。 「複雜」主要是主觀的 - 對我來說,'$$ anonfun $ go $ 2 $$ anonfun $ apply $ 2'不會告訴我任何有用的信息,也不會爲簡單的'flatMap'做5行跟蹤。儘管查看Scala的內部結構確實很有趣,但大部分時間我寧願理解*出了什麼問題*。快速。 – goncalopp

+3

從技術上講,這個Scala堆棧跟蹤的問題在於它不是一個Scala堆棧跟蹤,它是一個Java堆棧跟蹤。儘管如此,對你沒有幫助。 –

回答

4

IntelliJ IDEA的幫助,即使是在你沒有調試代碼的情況下(和Scala插件應該與社區版甚至工作):

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

你得到的是跳轉到一個可點擊的堆棧跟蹤正確的地方。

我在ScalaIDE論壇上問過,ScalaIDE是否也這樣做。 Mirco Dotta忍者回應:

是的,但它不是在Eclipse中找到的最簡單的功能。您需要open the "Java StackTrace Console"

有沒有問emacs的,有人請湊錢英寸

另外,請儘量考慮到「神祕」的名稱(去看看C++名字改編)是你付出的代價增加靈活性。