вывод профилировщика hprof не включает номера строк независимо от значения `lineno`

#java #profiling #hprof

#java #профилирование #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:

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

Комментарии:

1. Спасибо за указатель. У меня больше нет этого бенчмарка, настроенного для легкого запуска, но я буду иметь это в виду.

2. В примере Майка используется cpu=times option, ваш — heap=sites . Более поздний вариант выводит номер строки, первый — НЕТ.