Вывод профайлера hprof не включает номера строк независимо от значения 'lineno' - PullRequest
3 голосов
/ 28 октября 2011

Я бегу

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 Ответ

1 голос
/ 19 марта 2012

Я столкнулся с точно такой же проблемой, но помогла компиляция исходного кода с -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

Я получаю номера строк для пользовательских классов. Несмотря на то, что я не уверен, что происходит в вашем случае, это мои наблюдения -

  • Использование javac без -g: если для -lineno (по умолчанию y) установлено значение y, я все равно не вижу номеров строк для большинства классов, за исключением пользователя. определенные классы (Main в вышеприведенном случае). Если я установил -lineno на n, тогда я не буду видеть номера строк ни для одного из классов.

  • Использование javac с -g: если у меня -lineno установлено на y, я могу видеть номера строк для всех классов (не знаю, что происходит в вашем случае).

Единственная документация, которую я смог найти для HPROF , ничего не говорит об этом. Я думаю, что одним из вариантов было бы попытаться использовать меньшее количество необязательных аргументов и посмотреть результаты.

Примечание: я использую JDK 1.6 в приведенном выше примере

...