【发布时间】: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