デバッグ

概要

参考:

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

バックトレースを取得する

参考:

バックトレースを取得する方法 | DQNEO 起業日記

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

参考:

メソッドの定義場所を見つける方法 – Qiita

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

How can I get source code of a method dynamically and also which file is this method locate in – 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

SEGV 探偵が往く | なるせにっき

Ruby の落とし方 | Rubyist Magazine

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

入手:

gdb | RubyGems.org

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

リポジトリ:

sonots/gdbdump-ruby: Dump C level and Ruby level backtrace from living ruby process or core file using gdb – GitHub

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-debug-ide: An Interface Which Glues ruby-debug to IDEs Like Eclipse (RDT), NetBeans and RubyMine. – 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

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA