3
2

More than 3 years have passed since last update.

JRE環境でスレッドダンプを取る

Last updated at Posted at 2020-08-15

JREでアプリを動かしてるWindowsサーバで、スレッドダンプを取得する要件が発生した。
考えること、多い

  • JDKなら普通に取れるけど、JREだとjstackは存在しないので、JDKインストールしないといけない?
  • JREで動いてるアプリを、別のパスでインストールしたJDKでスレッドダンプ取れんのか?
  • アプリをJDKで動かさないといけないんじゃ?
  • JREはそのままにしてJDKを追加でインストールする? Pathとか気を付けないと
  • JREとJDKはver合わせないとだよね

色々わからないので、ためしにどういうエラーメッセージでるのかなーと、適当なJDKダウンロードしてきて、適当なJavaアプリにjstack仕掛けてみる
と思ったが、適当なJavaアプリがないので、EclipseがJavaで動いてることを思い出して、試しにEclipse (eclipse.exe) にやってみる

動いた

(スレッドダンプ取れた)
↑見出しの間違った使い方 (でかい文字にしたかったが方法がこれしかない残念)

eclipse.exeがどのverのどういうJava実行環境なのか全然知らないが、これで分かった
jstackは適当でも全然動く
jstackと取得対象のjavaとで、パスとかverとか違っても全然大丈夫だ

次に本番での取得を想定して検証してく

  • JREでアプリが動いてる社内サーバに
  • 同じverのJDKをダウンロードしてきてインストールして
  • コマンドプロンプトでJDKにpathを通して、JREアプリに対してスレッドダンプ取得

これもOK

じゃさらにつっこんで、jstack.exeとライブラリだけコピって実行できるか試してみる

  • JREのbinに、JDKのbinのjstack.exeをコピー
  • JREのlibに、JDKのlibのtools.jarをコピー
  • JREのbinにコピーしたjstackでJREで動かしてるアプリにスレッドダンプ取得
  • エラー
java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider: Provider sun.tools.attach.WindowsAttachProvider could not be instantiated
1548: no providers installed

(すいません、最初の投稿でいけたと書きましたが、あとからやり直してみるとやっぱだめでした)

ということで、JDKのインストールは必要なものの、jstackさんであれば、JRE相手でも簡単にスレッドダンプが取れることが分かりました

(備考)

  • そもそも最初からJDK使えばいんだけどね..
  • コマンドはこれだけ
jstack -l <PID>
  • tools.jarを配置しないとこんなエラーがでた
    • ここにでてるメッセージでlibをあさったらtoolsってのがあったので、置いたら次に進んだ(雑)
エラー: メイン・クラスsun.tools.jstack.JStackが見つからなかったかロードできませんでした

おしまい

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2