无论 `lineno` 值如何,hprof 探查器输出都不包括行号
Posted
技术标签:
【中文标题】无论 `lineno` 值如何,hprof 探查器输出都不包括行号【英文标题】:hprof profiler output doesn't include line numbers regardless of `lineno` value 【发布时间】:2011-10-28 17:20:38 【问题描述】:我在跑步
java -cp some:jars:out \
-agentlib:hprof=cpu=times,format=a,file=java.hprof.txt,lineno=y,doe=y com.foo.Benchmark \
< /dev/null
在输出中我得到没有行号的堆栈帧
THREAD START (obj=50000150, id = 200002, name="HPROF gc_finish watcher", group="system")
THREAD START (obj=50000151, id = 200001, name="main", group="main")
THREAD START (obj=50000281, id = 200003, name="Thread-1", group="main")
THREAD END (id = 200003)
THREAD END (id = 200001)
THREAD START (obj=500002a5, id = 200004, name="DestroyJavaVM", group="main")
THREAD END (id = 200004)
TRACE 307081:
com.foo.Benchmark.methodName(Benchmark.java:Unknown line)
com.foo.Benchmark.anotherMethodName(Benchmark.java:Unknown line)
...
如果我将lineno=y
更改为lineno=n
,我仍然会得到Unknown line
。
我用-g
编译了这些类。我的javac
看起来像
javac -g -Xlint -encoding UTF-8 -source 1.5 -d out -classpath ... src/main/com/foo/*.java
我检查了.class
文件以确保它们有行号:
javap -classpath out -c -l com.foo.Benchmark
展示了很多类似的东西
LineNumberTable:
line 1077: 0
line 1078: 8
line 1079: 14
line 1080: 21
line 1082: 23
line 1083: 31
line 1084: 43
我是否使用了一些阻止行号输出的标志组合?
【问题讨论】:
【参考方案1】:我遇到了完全相同的问题,但使用 -g
编译源代码有帮助。使用-g
编译后,我看到这样的行号(否则我看不到,没有-g
选项)-
LineNumberTable:
line 16: 0
line 17: 8
line 18: 12
line 19: 20
line 18: 29
line 21: 35
现在,如果我运行这个 -
java -cp "./build/classes" -agentlib:hprof=heap=sites,depth=20 org.sample.welcome.Main a b c
我确实得到了用户定义类的行号。尽管我不确定您的情况出了什么问题,但这些是我的观察 -
使用没有-g
的javac:如果我将-lineno
(默认y
)设置为y
,除了用户之外,我仍然看不到大多数类的行号-定义的类(在上述情况下为Main
)。如果我将-lineno
设置为n
,那么无论如何我都不会看到任何类的行号。
使用带有-g
的javac:如果我将-lineno
设置为y
,我可以看到所有类的行号(不确定你的情况出了什么问题)。
我能找到的关于HPROF 的唯一文档除此之外没有任何说明。我认为一种选择是尝试使用更少的可选参数并查看结果。
注意:我在上面的例子中使用的是 JDK 1.6
【讨论】:
感谢您的指点。我不再设置此基准来轻松运行,但我会牢记这一点。 Mike 的示例使用cpu=times
选项,您的 -- heap=sites
。后一个选项输出行号,第一个不输出。以上是关于无论 `lineno` 值如何,hprof 探查器输出都不包括行号的主要内容,如果未能解决你的问题,请参考以下文章