无论`lineno`值如何,hprof profiler输出都不包含行号

时间:2011-10-28 17:20:39

标签: java profiling hprof

我正在运行

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 个答案:

答案 0 :(得分: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,那么无论如何我都不会看到任何类的行号。

  • 将javac与-g一起使用:如果我将-lineno设置为y,我可以看到所有类的行号(不确定您的案例中出现了什么问题) )。

我能为HPROF找到的唯一文档没有说明这一点。我认为一个选择是尝试使用更少的可选参数并查看结果。

注意:我在上面的例子中使用了JDK 1.6