情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

Eclipse+Javaでデバッグモードで実行中かどうかを判定する方法メモ

Eclipse (60) Java (38)

デバッグモードでない場合にだけ、動作確認用の遅いコードの実行(TestNGのAssert.assert...の引数部分の実行)を飛ばしたかったので調べてみました。

本当は、もちろんこんな方法のお世話にならないように作業するのがよいのだと思うのですが、気が付いたらこれが手っ取り早そうな状態になっていたので。

目次

方法

Determine if a java application is in debug mode in Eclipse - Stack Overflow で紹介されている次の方法で、確かにデバッグモードかどうか(Debugで実行したか、Runで実行したか)を判定できました。

boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().
    getInputArguments().toString().indexOf("-agentlib:jdwp") > 0;

意味理解メモ

結論は上の通りなのですが、何をやっているのかの説明をしておきます。

java.lang.management.ManagementFactory.getRuntimeMXBean()

「java.lang.management.ManagementFactory.getRuntimeMXBean()」この部分で、RuntimeMXBeanインターフェースのオブジェクトを取得しています。このRuntimeMXBeanは、JVMを管理するためのインターフェースで、これを使って現在実行中のJVMの情報を取得することができます。

.getInputArguments():List<String>

そのいろいろ取得できる情報(あとで紹介)のうちで、JVMに渡されたパラメータを取得できるのがgetInputArgumentsメソッドです。

.toString()

しかし、それは起動時に渡されたパラメータそのものではなく、List<String>形式で返ってくるので、.toStringで、パラメータごとのただの文字列にしています(カンマ区切り)。

.indexOf("-agentlib:jdwp") > 0;

そして最後に、パラメータの中に「-agentlib:jdwp」というものがなかったかを調べています。パラメータが「-agentlib:jdwp」そのものならよいのですが、実際には「-agentlib:jdwp=...」と続くものなので、一度List<String>をStringにしてから探す、という操作をしているのだと思われます。

agentlib:jdwpって?

-agentlib:jdwpで始まるオプションは、例えばこのようになっています。

-agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:8000

これは、リモートデバッグ用のオプションであって、Eclipseがデバッグをする際に接続するポートその他の設定をしています。Eclipseがデバッグ実行時にこのオプションに追加する特徴を利用しているわけです。

このオプションについては、ヘルプに次ぎように紹介されています。

C:\Windows\System32>java -agentlib:jdwp=help
               Java Debugger JDWP Agent Library
               --------------------------------

  (see http://java.sun.com/products/jpda for more information)

jdwp usage: java -agentlib:jdwp=[help]|[<option>=<value>, ...]

Option Name and Value            Description                       Default
---------------------            -----------                       -------
suspend=y|n                      wait on startup?                  y
transport=<name>                 transport spec                    none
address=<listen/attach address>  transport spec                    ""
server=y|n                       listen for debugger?              n
launch=<command line>            run debugger on event             none
onthrow=<exception name>         debug on throw                    none
onuncaught=y|n                   debug on any uncaught?            n
timeout=<timeout value>          for listen/attach in milliseconds n
mutf8=y|n                        output modified utf-8             n
quiet=y|n

JDK1.4では違うかも

しかし、この「-agentlib:jdwp」を使えるのはJDK1.5以降であり、JDK1.4の場合は、「-Xdebug -Xrunjdwp:...」と指定するようです。なので、この判定方法はJDK1.4以前だと使えないと思われます。

RuntimeMXBeanで調べられる他のこと

RuntimeMXBeanを使うと、オプション以外にも、次のようなものが調べられそうです(詳しくは:RuntimeMXBean (Java Platform SE 7 ))。

  • getClassPath:クラスパスを取得
  • getUptime:アップタイムを取得
  • getStartTime:起動時刻を取得
  • getSystemProperties:システムプロパティを取得
  • getVmVersion:JVMのバージョンを取得
  • ...

コメント(0)

新しいコメントを投稿