実行中のアプリケーションを外から観察するコマンド。

使っている共有ライブラリを調べる。

lddでアプリケーションや共有ライブラリが依存している共有ライブラリを調べられる。

$ ldd /usr/bin/ruby
        linux-gate.so.1 =>  (0x008bc000)
        libruby1.8.so.1.8 => /usr/lib/libruby1.8.so.1.8 (0x008f7000)
        libpthread.so.0 => /lib/i686/nosegneg/libpthread.so.0 (0x00a7d000)

Mac OSXにlddは無い。代わりにotoolを使う。

$ otool -L /opt/local/bin/ruby
/opt/local/bin/ruby:
        /opt/local/lib/libruby.dylib (compatibility version 1.8.0, current version 1.8.6)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.3)
        /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
        /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)

Ruby

スレッドダンプが見たい。

スレッドが止まってる気がする時とか。

xray。Javaと同様に、kill -QUITでスレッドダンプが見える。

gem install xray
  • caller_for_all_threads 全スレッドのダンプを取るための拡張。Rubyのビルドが必要。もうちょっと調べる。
適当なタイミングでトレースしたい。

5秒ごとに0.5秒トレースをオンにする。

#! /usr/bin/env ruby

require "tracer"

Thread.start do
  loop do
    sleep 5
    Tracer.on
    sleep 0.5
    Tracer.off
  end
end

a = 0
loop do
  a = a + 1
end
シグナルを送ってトレースをオン・オフ。

(書く予定)

プロセスと仲良くなる。

htopを入れたら、急にプロセスが身近に思えるようになりました。htopサイコー。

  • htop - an interactive process-viewer for Linux
    • 矢印キーで上下左右にスクロール。
    • /でインクリメンタル検索。
    • tでツリー表示。
    • P/M/Tでソート。Iで反転。>でメニューからソート選択。
    • kでメニューから送りたいシグナルを選べる。
    • スペースキーでマークしてkでまとめてkill。
    • Sで設定。
      • Highlight program "basename" →オン
      • Display threads in a different color →オン
    • sでstrace表示。

あとはEC2で素のdebianを触るようになったのが結構良かった。はじめから動いてるプロセスが超少ないので、全体を把握した気持ちになれる。