【问题标题】:Add user-specified information to java stack traces将用户指定的信息添加到 java 堆栈跟踪
【发布时间】:2011-08-29 07:41:05
【问题描述】:

有没有办法向 java stacktrace 添加额外的信息?

我正在开发一种脚本语言的解释器,并希望在 java 堆栈跟踪中查看相应的脚本代码行。

输出可能如下所示:

java.lang.NullPointerException 
at package.IPF_Try.execute(IPF_Try.java:76) called in script.scr:155
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_If.execute(IPF_If.java:105)  called in script.scr:130
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_Main.execute(IPF_Main.java:147) 
...

或者这个:

java.lang.NullPointerException 
at package.IPF_Try.execute(IPF_Try.java:76)
  --- called in script.scr:155 ---
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_If.execute(IPF_If.java:105)
 --- called in script.scr:130---
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_Main.execute(IPF_Main.java:147) 
...

这将使调试更容易,不幸的是谷歌找不到任何东西来实现这一点。

我能想到的唯一方法是动态生成许多带有方法的类,其名称包含我需要的信息,并且只需调用堆栈跟踪中的下一个方法 - 但这似乎浪费了 (permgen) 内存和 cpu 循环给我。

【问题讨论】:

  • 有趣的问题。 java 编译器将带有文件名和行号的调试符号放入字节码中。我想如果你弄乱了字节码,你可以调整它以更好地满足你的需求。 JSP 编译器是否在做类似的事情?
  • @Thilo - 是的 - JSP 被编译为字节码(有时使用中间 Java 形式);您通常可以通过查看服务器的“工作”目录来找到已编译的类。
  • 问题是我不能简单地弄乱我的方法的字节码,因为它们是从各种脚本调用的,所以我不能向它添加一条特定的信息。但是,我可以动态创建一些在其方法名称或类似名称中包含必要信息的类,但我担心会影响性能。
  • @McDowell: 是index.jsp:304,还是__internal_index__jsp.java:5068

标签: java debugging stack-trace


【解决方案1】:

如果您将脚本转换为字节码,您可以使用SourceFileLineNumber 属性提供调试详细信息。

我不知道在运行时将信息注入调用堆栈的机制。

【讨论】:

  • 那太糟糕了,感谢您对 SourceFile 和 Linenumber-Attributes 的参考。也许我毕竟必须生成类,但是由于每个文件和每个行号都需要一个类,这意味着生成数千个虚拟类...
  • @ChristophK,为什么每行需要一节课?您可以在脚本中的每个例程/部分使用一个类吗?
  • 这可能会起作用,但是我尝试了一些创建“虚拟类”的方法,甚至几千个似乎也占用了相当多的永久代空间。
猜你喜欢
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多