3

私は走っています

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=ylineno=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

行番号の出力を妨げるフラグの組み合わせを使用していますか?

4

1 に答える 1

2

私はまったく同じ問題に直面しましたが、ソースをコンパイルすると-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について私が見つけた唯一のドキュメントは、これ以上何も述べていません。オプションの引数を減らして結果を確認することも 1 つの選択肢だと思います。

注: 上記の例では JDK 1.6 を使用しています

于 2012-03-19T17:09:12.723 に答える