ブレークポイントを設定しようとしているときに、Eclipseでこの奇妙なエラーが発生しました。
Unable to insert breakpoint Absent Line Number Information
私はコンパイラオプションからチェックボックスをチェックしたが運が悪かった。
Eclipse 3.4.1、Tomcat 6.0に接続されたSun JVM1.6.0_07(別のマシン、Sun JVM1.6.0_16上でデバッグモードで実行されている、デバッグ接続は正しく機能した)で同じエラーメッセージが表示されました。
ウィンドウ - >設定 - > Java - >コンパイラ - >クラスファイルの生成: "生成されたクラスファイルに行番号属性を追加する"がチェックされていました。私はきれいな、再コンパイルしました。チェックを外し、再コンパイルし、チェックし、再コンパイルしました。私はプロジェクトがグローバル設定を使用していることを確認しました。それでも同じメッセージ。
私はant buildに切り替えました。
<javac srcdir="./src/Java" destdir="./bin" debug="true">
それでも、同じメッセージ。
私はこのメッセージの原因とそれが消えない理由を知りませんでした。実行中のTomcatデバッグセッションと関係があるようですが、切断されたときに再コンパイルすると問題が解決します。しかし、デバッガをTomcatに接続したり、接続されたデバッグセッション中に新しいブレークポイントを設定したりすると、再び表示されます。
しかし、メッセージが間違っていたことが判明しました:デバッグの前後にデバッグポイントを設定することができました(javap -lも行番号を表示しました。無視してください。
これは私の問題を修正しました:
Springに関連する問題では、場合によっては「行番号なしで」クラスが生成されることがあります。たとえば、インターフェースのない@Service
アノテーション付きクラスであれば、インターフェースを追加すればデバッグできます。完全な例については、 こちら をご覧ください。
@Service("SkillService")
public class TestServiceWithoutInterface {
public void doSomething() {
System.out.println("Hello TestServiceWithoutInterface");
}
}
上記のサービスでは、 "行番号が抜けている"という原因で春によって生成されたインタフェースがあります。実際のインターフェースを追加すると、生成問題が解決します。
public interface TestService {
void doSomething();
}
@Service("SkillService")
public class TestServiceImpl implements TestService {
public void doSomething() {
System.out.println("Hello TestServiceImpl");
}
}
私は、この問題に対するBlackBerry SDK側からの答えを持っています。コンパイラーのオプションを何度変更しても、実際の基本設定ファイルは変更されませんでした。
プロジェクトの.settingsフォルダーでorg.Eclipse.jdt.core.prefsというファイルを探してください。
そこでは手動で設定を変更することができます。
org.Eclipse.jdt.core.compiler.debug.lineNumber=generate
これに加えて、私は時々私はEclipseが出す警告を無視することができます、そしてそれは必要な場所で止まることに気づいています...開発者として働いているとき。
これは私のために働いた:
Window --> Preferences --> Java --> Compiler --> Classfile Generation
の下では、すべてのオプションはTrue
にする必要があります。debug="true"
タスクで<javac>
を作成しました。Debug
モードで再起動しましたこれがまだ関連性があるかどうかわからない、おそらく別の船員はこれが便利だと思う。
デバッグフラグをオフにしたクラスファイルをコンパイルしたときにメッセージが表示されます。
Eclipseでは、前述のオプションで有効にできます。
「ウィンドウ」 - >「設定」 - >「Java」 - >「コンパイラー」 - >「クラスファイルの生成」:「生成されたクラスファイルに行番号属性を追加する」
しかしjarファイルがあれば、コンパイルされた出力が得られます。この問題を解決する簡単な方法はありません。
ソースにアクセスでき、jarファイルを取得するためにantを使用する場合は、次のようにantタスクを変更できます。
<javac destdir="${build.destDir}" srcdir="${build.srcDir}" source="1.6" fork="true" target="${javac.target}" debug="on" debuglevel="lines,vars,source" deprecation="on" memoryInitialSize="512m" memoryMaximumSize="1024m" optimize="true" >
ハッピーデバッグ.
念のために、使用しているEclipseのバージョンとテクノロジ(Aspect Javaの場合はJava JDT、C++ CDTの場合はAJDT)を指定しておくと役立ちます。
Java側では、私はあなたの "コンパイラオプションからチェックボックスをチェックした"はこれを参照すると思います これ
"Window --> Preferences --> Java --> Compiler --> Classfile Generation
"の下では、すべての 'Class file
'生成オプションはTrueに設定されています。
あなたのプロジェクトは、グローバルレベル(widows Preferences)またはプロジェクト固有のレベルでのみチェックしていますか?
そして、あなたは(あなたがブレークポイントを設定しようとしている)クラスが開かれたことを確認していますか:
.Java
ではなく.class
ですか?すべてをきれいにし、すべてを再構築し、潜在的な jarの衝突をチェックします 。
他に何もうまくいかない場合は、デバッグパースペクティブを開き、既存のすべてのブレークポイントをクリアしてから元に戻します。
EclipseからデバッグモードでTomcatを起動しようとしたときに、この問題が発生しました。私はコンパイルとデプロイの面倒を見てANTビルドファイルを持っていました。他の回答で説明したように、デバッグフラグをtrueに設定し、アプリケーションを再デプロイしたところ、問題なく動作しました。
<javac srcdir="./src/Java" destdir="./bin" debug="true">
注:デバッグフラグを追加して再コンパイルしただけでも、アプリケーションはサーバーに再デプロイする必要があります。 Eclipseがクラスファイルをデバッグしているところ。非常にはっきりしていますが、1時間かそこらの時間をかけて頭をかいて、なぜ動かないのか疑問に思います(私を信頼してください)。
私は6つの異なるバージョンのJavaがインストールされているので、私が使用したいJavaバージョンのものと一致するようにデフォルトのJDK準拠を変更しなければなりませんでした。 Java 1.6を使用してすべてのビルド/コンパイルを行った場合、デフォルトでEclipseのコンパイラ準拠レベルはJava 1.7に設定されていました。
だから私がしたのはただ
Eclipseはもはや「ブレークポイント不在行番号情報を挿入することができません」と文句を言わず、デバッグ用ブレークポイントは実際に動作します。
使用するjre
を変更してみてください。代わりにjre
のフォルダーにJDK
を設定してください。
私はここでほとんどすべての解決策を試してみましたが、運が悪いです。 「もう一度教えないでください」をクリックしてみましたか?そうした後、プログラムを再起動しましたが、すべて問題ありませんでした。何も悪いことではないかのように、Eclipseが私のブレークポイントを打ちました。
私にとっての根本的な原因は、Eclipseが自動生成されたSpring CGLIBプロキシオブジェクトのデバッグを設定しようとしていたことです。そのレベルで何かをデバッグする必要がなければ、この問題は無視してください。
私は桟橋のサーバーで作って、そしてANTによって新しい.warファイルをコンパイルするとき、私は同じ問題を抱えていました。前に書いたようにJava Compilerを設定しなければならないのと同じバージョンのjdk/jreコンパイラとビルドパス(例えばjdk 1.6v33、jdk 1.7、...)を作るべきです。
私は全力を尽くしましたが、まだ動作していません。解決策は、コンパイルされた.classファイルと生成されたwarファイルのターゲットを削除し、今度はその作業を行いました:)
このメッセージにはもう1つの理由があります。私はScalaをプログラミングしていました。解決策は次のとおりです。
これでデバッグはうまくいくはずです。 Scala IDEプラグインをインストールしたことに注意してください。お持ちでない場合、このオプションは利用できないかもしれません。
Spring AOPでこのメッセージを受け取りました(CGLIBライブラリーから来ているようです)。無視をクリックしてもうまく動作するようです、私はまだデバッグできます。
私の状況は似ていました:
spyTask = spy(new Task())
のように、私はMockitoを使ってスパイを作成していましたTask.Java
の内側)にブレークポイントを置きました。このブレークポイントは、Debug As... > JUnit Test
を実行するたびに、問題のエラーを生成します。
この問題に対処するために、ブレークポイントを実際のテスト(TaskTest.Java内)に移動しました。実行が停止したら、ブレークポイントを元の場所(Task.Java内)に追加しました。
私はまだ同じエラーを得ました、しかし「OK」をクリックした後に、ブレークポイントはちょうどうまくいきました。
誰かに役立つことを願っています、
- gmale
私はJBoss 7.1でも同じエラーがありました。そして私はZefiroと同じようにしました。ただエラーを無視して、私は普通にブレークポイントを置くことができました。私の場合、私は思想のあるAntビルダーを構築していましたが、これが私のjavacタスクです。
<javac
srcdir="${src.dir}"
destdir="${build.classes.dir}"
includeantruntime="false"
debug="${debug}"
verbose="false"
debuglevel="lines,vars,source"
source="1.6"
target="1.6">
<!-- Sppressing warning for setting an older source without bootclasspath
(see: https://blogs.Oracle.com/darcy/entry/bootclasspath_older_source) -->
<compilerarg value="-Xlint:-options"/>
<classpath>
<fileset dir="${lib.dir}" includes="*.jar" />
<fileset dir="${jboss.lib.dir}" includes="**/*.jar" />
</classpath>
</javac>
これはここに詳しく説明されています:
https://github.com/spring-projects/spring-ide/issues/78
今後の参考のために、これが回答の関連部分です(Spring Bootアプリケーションを参照しているという事実は無視してください。他の多くのケースでも動作は同じです)。
Eclipse/STSでブレークポイントを設定するときはいつでも、アプリを起動すると、IDEはVMにブレークポイントを設定しようとします。あなたがあなたのケースであなたがデバッグモードで起動アプリを実行するとき、それは何が起こるかです。
JVMにロードされるクラスごとに、IDEはブレークポイントを設定する必要があるかどうかを確認します。ブレークポイントを設定することにした場合は、それを試みます(通常、特定の行にソースファイルの行ブレークポイントを設定するため、その行番号を含む、IDEのブレークポイント定義からの情報を使用します)。
この決定(特定のロードされたクラスにブレークポイントを設定するかどうか)は、ブレークポイントを設定した型、それを囲む型、および内部クラスを確認します。これにより、内部クラス(匿名内部クラスであっても)のブレークポイントが確実にJVMに設定されます(そして無視されません)。
Spring Bootは実行時にあなたのコントローラのための内部クラスを生成する(これはエラーメッセージに現れるCGLIB生成された内部クラスである)。 JVMはそのクラスをロードするときに、(この内部クラスに対して)囲んでいる型の行番号ブレークポイントを設定しようとします。生成された内部クラスは行番号情報を持っていないので(行番号情報を持っている必要はありません)、この内部クラスに対してブレークポイントを設定することは前述のエラーメッセージで失敗します。
IDEが囲んでいる型(あなたのコントローラクラス自身)をロードするとき、それはまた行ブレークポイントを設定しようとしそれで成功します。これはブレークポイントマーカー上のチェックマーカーで視覚化されます。
したがって、表示されたエラーメッセージは無視してかまいません。このエラーメッセージが表示されないようにするには、設定([Java] - > [デバッグ])に移動し、「行番号属性がないためにブレークポイントをインストールできない場合は警告する」を無効にします。
JunitとMockitoを使用したときに同じエラーが発生したら、静的クラスに@PrepareForTest
を追加するのを忘れました。
以下のコードを追加して私の問題を解決しました。
@PrepareForTest({XXXXX.class})
それが同じであるかどうかわからない。
TomcatにデプロイされたWAR(複数のEclipseプロジェクト成果物から構築されたもの)をデバッグするときにも同じ問題がありました。
私はANTビルドスクリプトを使ってすべてをビルドしています。これがあなたがしていることであれば、debug = trueフラグがあなたが持っているすべてのjavac antタスクに設定されていることを確認してください。これは私の唯一の問題でした - それがあなたの問題に役立つことを私は願っています!
私は同じ問題を抱えていました、私は解決策を探すために多くの時間を費やしました、しかしこれらの解決策は役に立たない、それで私はすべてのケースを自己勉強しました。以下は、問題を解決するためのステップです。1. JDKとJREのバージョンをすべて削除し、1つのバージョンだけを残します。 2. EclipseでのJava_HOMEシステムとJavaコンパイラの設定は同じです。場合によっては、上記のエラーは消えませんが、デバッグモデルで実行できます。
私の問題は、私が2つのJARを持っていて、EclipseのJava Build Path => Order & Export
タブでの順序に基づいて、一方を他方でオーバーライドしようとしていたということです。私がこのようにしたとき、私は手動でソースを添付しなければなりませんでした。
デバッグしていないJARファイルを削除し、デバッグ用JARファイルを自分の\ WEB-INF\lib \ディレクトリに置いて、クリーニング、ビルドなどを試みたところ、うまくいきました。今回(添付されたソースを削除した)、手動でソースを添付する必要なしに、それは自動的に私にデバッグコードをナビゲートさせるでしょう。ブレークポイントとデバッグも機能しました。
誰かがまだ問題を抱えている場合に備えて、私はまた他の答えで言及されているこれらの特定の解決策のすべてを試してみました:
Add line number attributes...
のチェックを外し、適用し、再チェックしてくださいorg.Eclipse.jdt.core.prefs
を編集する: https://stackoverflow.com/a/31588700/1599699また、通常の方法でサーバーをシャットダウンし(そしてJava.exeが実際に閉じられていることを確認して)、両方のプロジェクトの\ build \ディレクトリーを削除し、Eclipseを-cleanパラメーターで再始動し、デバッグJARを再作成してリフレッシュします。デバッグJARを含むプロジェクトをクリーンアップしてビルドし、デバッグモードでサーバーを起動し、パブリッシュ/クリーニングし、ブレークポイントを設定します。
あるプロジェクトでも同じ問題があり、Window-> Preferences ...で行番号属性をリセットしようとし続けました。それから各プロジェクトに行番号属性の設定があることに気づきました。プロジェクトを右クリックしてプロパティを開き、[Javaコンパイラ]を選択して[行番号属性を追加]チェックボックスをオンにします。
Spring MVC + Mavenプロジェクトでも同様の問題がありました。ターゲットフォルダが行に関する情報を含むクラスで更新されない理由を突き止めるために2時間を費やしました。
すべてのビルドを続行する前に、すべてをクリーンにし、すべてのクラスがフォルダから削除されていることを確認することをお勧めします。
疑わしい場合 - コンパイルされた.classファイルに行番号が含まれているかどうか - Eclipseで.classファイルを開きます。 Eclipseはファイルを逆コンパイルし、行番号が存在するかどうかを通知します。
私はjarのコンパイル/構築中に上記のすべてを行いました - それでも同じ問題がありました。
最終的には、サーバーの起動中にjvmargが以下のように変更され、最終的に私にはうまくいきました。
1)javaagentとbootclasspathに関する一連のjvm引数を削除/コメント化しました。
2)次の行をオン/コメント解除します。
サーバーを起動すると、ブレークポイントに到達することができます。私はjavaagentがどういうわけかEclipseの行番号検出能力を妨害していたのではないかと思います。
私たちはこの問題を解決するのに非常に有用な情報をすでに持っています、しかし私の特別な場合、問題は私がプロジェクトをリポジトリから更新したので新しいクラスはコンパイルされたソースから最新のコードで生成されました。問題は、POMファイル内のプロジェクトのバージョンを変更するのを忘れていたことと、ブレークポイントが新しいコードに設定されていて、POMファイルが以前のコンパイルのJARファイルで使用可能な古いバージョンをまだ指していたためです。 JARファイルからのクラスが選択され、新しいコードからのクラスは選択されませんでした。
これを解決するには、メインプロジェクトのPOMファイルのバージョンを更新し、ソースコードを消去して再コンパイルし、最後に環境を更新する必要があります。これが他の人に役立つことを願っています。
@ManagedBean(javax.annotation.ManagedBean)を使用してクラスに注釈を付けたときにこの問題が発生しました。警告メッセージは、JBoss EAP 6.2.0で新しく準拠したアプリを実行したときに表示されました。それを無視してとにかく走らせても助けにはならなかった - ブレークポイントに到達することはなかった。
JSFページでELを使用してそのBeanを呼び出していました。それでは、@ManagedBeanがそれに適していない可能性があります(私はCDIが初めてです)。アノテーションを@Modelに変更すると、Beanが実行されましたが、ブレークポイントの警告も消え、予想通りにブレークポイントに到達しました。
要約すると、@ManagedBeanアノテーションは、使用するアノテーションが間違っていたかどうかにかかわらず、行番号をめちゃくちゃにしているように見えました。
誰かがJavaのソースコードをデバッグしようとしている場合、これが私のために働いた唯一のソリューションです。上記の回答のほとんどは、コンパイラーオプションを設定して行番号を生成することについて説明していますが、Javaのソースコード(Java.util.HashMapなど)をデバッグする場合は、上記のオプションが機能しない可能性があります。これは、ソースコードをデバッグするプロジェクトのjre
jarではなく、jdk
jarを指すJava Build Path --> Library --> JRE System Library
を持っているためです。 jre
jar内にバンドルされているクラスは、特定のオプションで既にプリコンパイルされており、コンパイラオプションの設定は適用されません。解決策は、JRE System Library
がjdk
jarを指すようにプロジェクトを再構成することです。 jdk
jar内のクラスは、コンパイラオプションの設定を優先します。したがって、プロジェクトのJRE System Library
を更新してjdk
jarを指すようにすると、Javaソースコードのデバッグが開始されます。
ランタイムのメインクラスがあるプロジェクトが、ブレークポイントがあるクラスと同じプロジェクトであることを確認してください。そうでない場合は、両方のプロジェクトが実行構成のクラスパス内にあることを確認し、before any jarとクラスフォルダーが表示されるようにします。
私もこの問題に遭遇しました。私はAntビルドスクリプトを使用しています。私はレガシーアプリケーションに取り組んでいるので、私はJDKバージョン1.4.2を使用しています。これは以前は機能していたので、見回し始めました。 [JRE]タブの[Debug]設定で、Javaのバージョンが1.7に設定されていることに気付きました。一度1.4に戻したところ、うまくいきました。
これが役に立つことを願っています。
ロギングマネージャをデバッグしようとしていましたが、jreをjdkに変更してから、[main]タブの[Java Runtime Environment]でこのjdkを選択する必要がありました。デバッグ設定の「実行時JRE」それですべてうまくいきました。
以下を確認してください。
1)[ウィンドウ] - > [設定] - > [Java] - > [コンパイラ] - > [クラスファイルの生成]で、すべてのオプションをTrueにする必要があります。
(1) Add variable attributes...
(2) Add line number attributes...
(3) Add source file name...
(4) Preserve unused (never read) local variables
2)プロジェクトの.settingsフォルダーで、org.Eclipse.jdt.core.prefsというファイルを探します。 org.Eclipse.jdt.core.compiler.debug.lineNumber = generateを確認または設定します
3)それでもエラーウィンドウが表示される場合は、チェックボックスをクリックしてエラーメッセージを表示しないでください。
4)プロジェクトをクリーンアップしてビルドします。デバッグを開始します。
通常、エラーウィンドウは表示されなくなり、デバッグ情報は正しく表示されます。
上記の解決策がうまくいかず、Spring Beanのインジェクションを行った後にその問題が発生し始めた場合、問題はインジェクションされたクラスにインターフェースを使用しなかったことです。インターフェースを実装するクラスでインジェクションをやろうとすると問題が解決します。たとえば、リンクをたどってください。 Bean作成用のブレークポイント問題をインストールできません
私は以前の解決策のほとんどを試してみたが、それでも問題を抱えていた。これは私が次にしたことです:
このステップのいくつかは必要ないかもしれませんが、「念のため」。
それで、以前の解決策がまだあなたのために働かないならば。これを試して。それが役立つことを願っています;-)
Tomcatサーバーを使用したWebプロジェクトの場合は、次の手順で解決しました。
上記のことはうまくいきませんでした。以下のソリューションが最終的に機能しました。デバッグ構成->クラスパス->ユーザーエントリ->(デバッグするプロジェクトのsrcフォルダーを追加します。)
私はEclipse IDEでも同じ問題に直面していました。私はこの質問のすべての答えを読み、ほぼすべての設定を試してみましたが、運が悪かったです。
それで、私はプロジェクトのランタイムライブラリを変更しようとしました、以前はJREでした - Java SE 1.8
私はJREをJDKに変更しようとしました、そしてそれは私のために働きました:
JREからJDKに切り替える手順は次のとおりです。
リストから他のすべてのインストール済みJREを削除する(オプション)
そしてこれで終わりです!
Eclipseでデバッグするときのブレークポイントエラーを修正するにはどうすればよいですか? この行に置き換えてください。
Eclipse.preferences.version=1
org.Eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.Eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.Eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.Eclipse.jdt.core.compiler.compliance=1.8
org.Eclipse.jdt.core.compiler.debug.lineNumber=generate
org.Eclipse.jdt.core.compiler.debug.localVariable=generate
org.Eclipse.jdt.core.compiler.debug.sourceFile=generate
org.Eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.Eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.Eclipse.jdt.core.compiler.source=1.8