2011-01-14 10 views
3

私は、JavaコードではなくScalaコードをデバッグするとき、デバッガ(Intellij IDEA + Scalaプラグイン)とどのような違いがあるのか​​疑問に思っています。私の理解では、デバッガは言語と密接に結びついています。つまり、JavaデバッガはScalaコードを処理できませんが、デバッガが行うバイトコードである限り、JVMが注目されています。右 ?デバッガとは違い、私はデバッグしているScalaコードですか?

重要なアップデート:問題は、バイトコードデバッガがScalaをどのように制限しているかの例を示すことでした。ブレークポイントに達して次の行に行きたくないと思うが、デバッガでアプリケーションのコンテキストでScala式を評価したい(例えばシングルトンオブジェクトから演算子メソッドを呼びたい)。デバッガは、Scalaを理解できないために立ち往生しています。私は自分自身で変換を行い、その結果のJavaをデバッガに入力する必要があります。 問題は、「ブレークポイントのもの」だけがバイトコードレベルで処理できることです。あなたは式を時計の下に置いておきたいのですが?デバッガは、監視された式を評価するためにScalaを理解する必要があります。今回は、私が正しいと確信しています。復讐は私のものです、ご主人様Saith :-)

答えて

8

あなたの前提は間違っています。

理由はデバッガがデバッグする言語を気にしないためです。これは、特定のソースファイルの行を含むブレークポイントで停止します。ソースファイルは単なるテキストであり、デバッガはソースファイルをスキャンしません。ソースファイルが別のディレクトリにある場所を、右のディレクトリにあるテキストファイル(正しいファイル名)を設定したブレークポイントに変更すると、デバッガはブレークポイントが発生したときにそれをうれしく表示します。ブレークポイントを設定するたびに、ideはデバッガにこの行のバイトコードをスキャンし、ヒットすると停止します。これはもちろんあなたのIDEが同じテキストファイルをクラスファイルにコンパイルしようとしている場合はうまくいきませんが、偽のテキストファイルをjarファイルのソースとして作成し、ソースファイルのマッピングを行うとうまくいくでしょう。

もしそれについて考えるなら、単純なテンプレートを書いて、サポートのデバッグ中にそれをコンパイルすることはそれほど難しくありません。 asmを使用してすべてのprint文を作成し、asmにこのprint文がこの行のテンプレートファイルからあることを伝えるだけです。その後、デバッグ可能なものを維持しながら、より巧妙なものを追加することができます。

+0

これは当てはまりますが、Scalaコードの1行には通常より多くのステップが含まれているため、Scalaには難題があります。ラインレベルのデバッグScalaはJavaのラインレベルのデバッグよりもはるかに便利ですこれは、各行でより特異な動作をする傾向があります。 EPFLには、特別なScalaデバッガをサポートするために、Scalaが生成したクラスファイルに追加のデバッグ情報を追加する人がいます。 –

+1

各行を可能な限り単純にするためのもう一つの議論と、間違いなく1行にたくさんのたわごとを置くことに対する絶対的な議論です。 –

+0

@mP申し訳ありませんが、ツールの欠点は、特定のスタイルのコードの "議論"として数えられるはずです。 –

関連する問題