デバッグ
概要
参考:
Rails 4 でのデバッグ方法 | blog.10rane.com
Ruby と Rails の独特な挙動と、それと戦うためのデバッグ手法 – Qiita
Debugging Ruby – Techniques to Help You Fix Your Code | RubyGuides
警告の発生箇所を突き止める
デバッグを有効にする。
$DEBUG = true
コマンドラインでデバッグを有効にしてスクリプトを実行する。
$ ruby --debug script.rb
参考:
Getting stack trace info for a ruby warning – Stack Overflow
Can you ask ruby to treat warnings as errors? – Stack Overflow
バックトレースを取得する
参考:
Ruby でのバックトレース活用法 | Rubyist Magazine
もっと簡単にデバッグ用にメソッドの呼び出し元/スタックトレースをログに出力する方法 | まちゅダイアリー
How to get a stack trace object in Ruby? – Stack Overflow
cause
参考:
Ruby で RuntimeError のバックトレースを最初の raise までさかのぼって出力する – Qiita
まとめ
できる Ruby プログラマになるためのデバッグ手法 7選 | 侍エンジニアブログ
Byebug
リポジトリ:
deivid-rodriguez/byebug: Debugging in Ruby 2 – GitHub
ドキュメント:
GUIDE.md – deivid-rodriguez/byebug – GitHub
Documentation – byebug | RubyDoc.info
参考:
byebug でスクリプトをコマンドラインデバッグする – Qiita
print デバッグにさようなら!Ruby 初心者のための Byebug チュートリアル – Qiita
byebug コードリーディング | freedom-man
byebug や pry-byebug を使った後の挙動を10倍高速にしました | k0kubun’s blog
Debugging using ByeBug Gem in Rails 5 | Ruby Plus
Byebug Cheatsheet | Fleeblewidget
Pry
公式サイト:
Pry – an IRB alternative and runtime developer console [Official]
リポジトリ:
pry/pry: An IRB Alternative and Runtime Developer Console – GitHub
ドキュメント:
Documentation – pry | RubyDoc.info
参考:
Pry を使って Rails のコンソールをパワーアップ & デバッグをする | Rails Webook
今更ながら Pry について色々と調べてみた 前編 – Qiita
今更ながら Pry について色々と調べてみた 後編 – Qiita
Rubyist よ、irb を捨てて Pry を使おう | TIM Labs
Ruby / Rails デバッガことはじめ – Qiita
Pry を使ってデバックする | liberta-web blog
binding.pry でループ内にブレイクポイント仕掛けるとだるいことになる | もふもふ技術部
Create Break Points in Rails with Pry | Coderwall
Pry-Byebug
指定したコードの位置で Pry を起動する。
binding.pry
ステップ実行する。
> step
次の行まで実行する。
> next
現在のフレームを抜ける。
> finish
Pry セッションを終了して通常の実行を再開する。
> continue
リポジトリ:
deivid-rodriguez/pry-byebug: Step-by-step Debugging and Stack Navigation in Pry – GitHub
ドキュメント:
Documentation – pry-byebug | RubyDoc.info
参考:
pry-byebug を使って Rails アプリをステップ実行する | Hack Your Design!
pry-byebug で ruby をデバッグする – Qiita
Rails デバッグの為に pry を使いこなす | DoRuby
Ruby デバッガー binding.pry | のんびりしているエンジニアの日記
Ruby (on Rails) 開発でブレークポイント作りたいなら「pry-byebug」がオススメ! | SUKEMATSU.NET
docker-compose 上の Rails のデバッグを行う | My External Storage
Using `break` in `pry` · deivid-rodriguez/pry-byebug Wiki – GitHub
Add binding.pry breakpoint dynamically with pry-byebug | kinopyo blog
Set conditional breakpoint with pry-byebug – Stack Overflow
Breakpoints with pry-byebug don’t trigger in the console – Stack Overflow
How to correctly set up Pry in Rails 4.2 – Stack Overflow
How to move to the next line in binding.pry ? – Stack Overflow
Pry Doc
Gemfile に pry-doc を追加する。
gem "pry-doc", group: [:development, :test]
ソースを表示する。
> show-source open
show-source
のエイリアス $
を使う。
> $ open
オブジェクトのメソッド一覧を表示する。
> "hello".methods
モジュールのメソッド一覧を表示する。
> File.methods
メソッドが定義されているモジュールを調べる。
> method(:open).owner
オブジェクトのメソッドが定義されているクラスを調べる。
> "hello".method(:to_s).owner
モジュール関数のソースを表示する。
> $ OpenURI.open_uri
オブジェクト内に移動 (cd
) 、メソッド一覧を表示 (ls
)、メソッドのソースを表示する ($
)、Pry セッションを抜ける (exit
/ quit
)
(main)> require "open-uri" => true (main)> cd OpenURI (OpenURI):1> ls constants: Buffer HTTPError HTTPRedirect Meta OpenRead Options OpenURI.methods: check_options open_http open_loop open_uri redirectable? scan_open_optional_arguments locals: _ __ _dir_ _ex_ _file_ _in_ _out_ _pry_ (OpenURI):1> $ open_uri From: /usr/local/rbenv/versions/2.5.0/lib/ruby/2.5.0/open-uri.rb @ line 140: Owner: #<Class:OpenURI> Visibility: public Number of lines: 41 def OpenURI.open_uri(name, *rest) # :nodoc: uri = URI::Generic === name ? name : URI.parse(name) ...(省略) (OpenURI):1> exit => OpenURI
リポジトリ:
pry/pry-doc: Provide MRI Core Documentation and Source Code for the Pry REPL – GitHub
ドキュメント:
Documentation – pry-doc | RubyDoc.info
参考:
pry、pry-doc を使って Ruby 学習ヘ | Murajun’s Style
Ruby の IRB や pry でメソッドの定義元をすっと調べる方法 | TechRacho
pry-doc でカジュアルに Ruby のソースコードを読む – Qiita
Pry と pry-doc gem を使って Ruby のソースコードを読む | ジョージプログラマーの日記
Pry プラグイン
参考:
Pry をより高機能に使うためのパッケージ 6選のメモ | メモ帳代わりのブログ
Pry をより快適にしてくれる Gems とその設定方法 – Qiita
Pry の関係 Gem が最初からいろいろはいった jazz_fingers を試してみた | Scimpr Blog
source_location
参考:
Ruby で class や const の定義位置を調べる方法 – Qiita
How to Find the Method Definition | Rails Guides
How do I find where a constant is defined in Ruby? – Stack Overflow
How to find where a method is defined at runtime? – Stack Overflow
Access Pry’s show-source method from Ruby file – Stack Overflow
Thread.current.backtrace_locations
参考:
How to correctly set up Pry in Rails 4.2 – Stack Overflow
Pry::Byebug::Breakpoints#add_method
参考:
Method: Pry::Byebug::Breakpoints#add_method — Documentation for pry-byebug | RubyDoc.info
Bindex
例外発生時に binding
を使えるようにする。
リポジトリ:
gsamokovarov/bindex: Bindings for Your Ruby Exceptions – GitHub
binding_of_caller
リポジトリ:
banister/binding_of_caller: Retrieve the Binding of a Method’s Caller – GitHub
ドキュメント:
Documentation – binding_of_caller | RubyDoc.info
参考:
binding_of_caller Gem でメソッド呼び出し元の binding を手に入れる | pockestrap
debug_inspector
リポジトリ:
banister/debug_inspector: A Ruby Wrapper for the MRI 2.0 debug_inspector API – GitHub
参考:
Can you eval code in the context of a caller in Ruby? – Stack Overflow
セグメンテーションフォルト
Mac の場合、クラッシュログは ~/Library/Logs/DiagnosticReports
ディレクトリ、もしくは /Library/Logs/DiagnosticReports
ディレクトリに保存される。
参考:
Ruby 2.5 の SEGV と闘った話 | @watson1978 の日記
Ruby が SEGV したら | やっぱRubyでしょ。(LoveRuby.Net)
Ruby の C 拡張で SEGV おこした時の gdb での追い方、またはデバグ手法 | sonots:blog
core dump をとった後中身を見てみた gdbruby 編 | CubicLouve
プロセスのコアファイルからバックトレースする。| 技術的ブログ
Segfault on macOS with ffi > 1.9.21 · Issue #619 · ffi/ffi – GitHub
Ruby で segmentation fault – teratail
Ruby C extension, how to recover from segmentation fault – Stack Overflow
gdb
コアダンプを読み込んで GDB のセッションを開始する。
$ gdb $(rbenv which ruby) core
バックトレースを表示する。
(gdb) bt
指定したフレームに移動する。
(gdb) frame 12
フレームを上に移動する。
(gdb) up
フレームを下に移動する。
(gdb) down
セッションを終了する。
(gdb) quit
参考:
gdb を使った Ruby のデバッグ | クックパッド開発者ブログ
gdb を使って Ruby 2.4.0 のライブプロセスの情報を取得してみる | CubicLouve
gdb を使って Ruby 2.3.3 のライブプロセスの情報を取得する | CubicLouve
gdb で Ruby のバックトレースを自動で採取 | hiboma の日記
gdb で Ruby プロセスの C レベルと Ruby レベルのバックトレースを表示する方法 | sonots:blog
Getting a Ruby Backtrace from GNU Debugger | isotope eleven
Finding a Ruby Bug with GDB | Zachary Anker
Debugging Stuck Ruby Processes – What to Do Before You Kill -9 | New Relic Blog
How to use gdb to get ruby backtrace from different thread – Stack Overflow
gdb-ruby
リポジトリ:
david942j/gdb-ruby: It’s Time for Ruby Lovers to Use Ruby in gdb, and gdb in Ruby – GitHub
入手:
DTrace
DTrace を有効にして rbenv で Ruby をインストールする。
$ CONFIGURE_OPTS="--enable-dtrace" rbenv install 2.6.1
メソッドをトレースする。
ruby$target:::method-entry { printf("%s#%s\n", copyinstr(arg0), copyinstr(arg1)); }
C 言語で書かれたメソッドをトレースする。
ruby$target:::cmethod-entry { printf("%s#%s\n", copyinstr(arg0), copyinstr(arg1)); }
DTrace による監視を開始する。(Ctrl
+ C
で停止する。)
$ sudo dtrace -q -s probes.d -p PID
-q
:メッセージの出力を抑制する-s
:スクリプトを指定する-p
:プロセス ID を指定する
参考:
Ruby 2.5 の SEGV と闘った話 | @watson1978 の日記
Ruby 2.0.0 の DTrace の紹介 | Rubyist Magazine
バッチ処理の一部で 30 分以上かかっていた処理を 14 秒で終わるようにした話 | @watson1978 の日記
gdbdump-ruby
リポジトリ:
sigdump
リポジトリ:
frsyuki/sigdump: Use signal to show stacktrace of a Ruby process without restarting it – GitHub
gdbruby
リポジトリ:
gunyarakun/gdbruby: gdbperl for Ruby – GitHub
参考:
Core から Ruby のバックトレースを表示する gdbruby.rb を作った | グニャラくんの wktk 運営日記
Core Dump をとった後中身を見てみた gdbruby 編 | CubicLouve
segv-handler-gdb
リポジトリ:
kou/segv-handler-gdb: Dump C level backtrace by GDB on SEGV – GitHub
参考:
Ruby スクリプトがクラッシュしたときにより詳しく C レベルのバックトレースを出力する Gem | ククログ
blab
リポジトリ:
tuwukee/blab: A Debugging Tool – GitHub
ruby-debug
リポジトリ:
ruby-debug/ruby-debug: ruby-debug for Ruby 1.8 – GitHub
参考:
ruby-debug を使った Ruby / Rails アプリケーションのデバッグ方法 – GitHub Gist
gem のインストールログを取る
$ MAKE="make V=1" gem install gem_name --verbose > install_log.txt 2>&1
参考:
Segfault on macOS with ffi > 1.9.21 · Issue #619 · ffi/ffi – GitHub