Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyプログラムをデバッグおよび修正する方法

あなたのプログラムは、最初にあなたが望むことを正確に実行する頻度はどれくらいですか?

多くの場合、プログラムは期待どおりに機能しないため、ルビーのデバッグの技術を使用する必要があります。 理由を見つけるのに役立ちます。

次のエラーメッセージに精通している可能性があります。

undefined method 'some_method' for nil:NilClass

これは、nil値がコードへの道を見つけることができたことを意味します。

この記事で説明する手法を使用して、この問題や同様の問題に対処する方法を学びます。

エラーとスタックトレースを理解する

Rubyインタープリターからエラーが発生した場合、またはプログラムが本来の動作を実行していない場合は、デバッグの帽子をかぶる必要があります。

プログラムがクラッシュしていることが問題である場合は、エラーメッセージに注意を払うことが重要です。 、通常、何が問題になっているのかについての手がかりが含まれています。

ここに例があります

def method1
  method2
end

def method2
  puts invalid_variable
end

method1

このコードを実行すると、次のエラーが発生します:

/tmp/stack.rb:6:in 'method2': undefined local variable or method 'invalid_variable' for main:Object (NameError)
    from /tmp/stack.rb:2:in 'method1'
    from /tmp/stack.rb:9:in '
'

これは、スタックトレースと呼ばれるものです。

一緒に分析しましょう!

一番上の行から始めます。

ここで実際のエラーが発生しましたが、エラー状態がここで発生したことを意味するわけではありません。

ただし、調査を開始することをお勧めします。

これが取引です

テキスト 説明 ファイルと行番号 メソッド名 エラーメッセージ クラス名 例外名
/tmp/stack.rb :6
` method2
未定義のローカル変数またはメソッド‘ invalid_variable
メイン:オブジェクト
(NameError)

ご覧のとおり、このように分解しても、エラーはそれほど威圧的ではありません。

ちなみに、ここで例外のリストを見つけることができます。

最初の行の下のスタックトレースのすべての行は、コードがどのようにここに到達したかを示しています。

これは基本的にメソッドチェーンです。続けていくと、最終的にアプリのメインメソッドが見つかるはずです。

スタックトレースを処理するための一般的なアルゴリズムは次のとおりです。 :

  1. スタックトレースの一番上の行を読みます
  2. ファイルがプロジェクトの一部である場合:指定された行番号で障害のあるファイルを開きます。そうでない場合は、認識したファイルへの最初の参照が見つかるまで、スタックトレースをたどり続けます
  3. 明らかなものが飛び出しているかどうかを確認して修正します(エラーメッセージに記載されているものを探します)
  4. それでも問題が解決しない場合は、影響を受ける変数の値など、より多くの情報を見つける必要があります。

Rubyのデバッグ

おそらくよく知っている最も基本的な(必ずしも悪いことを意味するわけではない)デバッグ手法は、疑わしい変数の値をダンプすることです。

Rubyでは、 putsを使用してこれを行うことができます またはp

pを使用する puts variable.inspectと言うのと同じです 、オブジェクトを見るのに便利です。

Book = Struct.new(:title)

def find_book(title)
  books = []
  books << Book.new('Eloquent Ruby')

  books.find { |b| b.title == title }
end

book = find_book('Eloquent Ruby')
p book # This will print our book object

book = find_book('POODR')
p book # This will print nil

book.name # Guess what happens next!
>

Pryで深く掘り下げる

チェックする変数が多い場合は、putsを追加します どこでもあまり実用的ではないかもしれません。

その場合は、こじ開けてみてください。

こじ開けの使用 コードを特定のコード行(ブレークポイントとも呼ばれます)で停止させると、プロジェクトのコンテキストでrubyコードを評価したり、多くのコードの1つを実行したりできるirbのような環境に移動します。便利なこじ開け コマンド。

こじ開けの使用は本当に簡単です

あなたがしなければならないのはbinding.pryをドロップすることだけです pryブレークポイントをインストールする場所。

また、プロジェクトにこじ開ける必要があります(「こじ開け」が必要です)。

一時的に実行したい場合は、次のようにルビースクリプトを呼び出すことができます。

ruby -rpry app.rb

これはRailsアプリにはあまり役立たないので、Gemfileにpryを追加することをお勧めします。

私がやりたいのは、ブレークポイントと同じ行にrequireがすでに含まれているマクロ/スニペットをエディターに配置することです。したがって、それを削除すると、両方が削除されます。

これは、こじ開けセッションに参加したときに表示されるものです:

Rubyプログラムをデバッグおよび修正する方法

詮索好きなセッションを完全に終了したい場合は、 exit!と入力できます。 、定期的に終了を行う場合 次のブレークポイントまでプログラムを実行します。

詮索好きの力はここで終わりではありません。たとえば、lsを使用できます オブジェクトがアクセスできるメソッドとインスタンス変数を確認するコマンド。

Rubyプログラムをデバッグおよび修正する方法

ヘルプを実行することを忘れないでください すべてのグッズのリストを取得するコマンド!

別のRubyデバッガー:Byebug

Byebugは、Pryの代わりとして、またはRubyのgdbのようなデバッガーとして機能できます。

前者に使用したい場合は、バイバグをドロップするだけです。 binding.pryの代わりに コードを停止したい場所。 Byebug over pryを使用することの短所の1つは、構文の強調表示が提供されないことです。

ブレークポイントを設定し、byebug内でコードをデバッグする方法を見てみましょう!

通常はhelpコマンドを呼び出しますが、この場合は情報が少し不足しています:

Rubyプログラムをデバッグおよび修正する方法

したがって、ドキュメントを参照する必要があります。

コマンドbreakの使用方法を確認できます ブレークポイントを設定できる行番号。

ブレークポイントのリストを取得するには、情報ブレークポイントを使用できます 。

ブレークポイントを設定したら、次のコマンドを使用してプログラムの実行を進めることができます。

  • ステップ (1つの命令を進め、メソッド呼び出しにステップインします)
  • 次へ (1つの命令を進め、メソッドの内部には入りません)
  • 続行 (最後または次のブレークポイントまで実行)

コマンドなしで最後のコマンドを繰り返すだけでEnterキーを入力すると、コードをウォークスルーするときに非常に便利です。

他のすべてが失敗したとき

十分な時間をかけて解決策が見えなくなったら、必ず休憩してください。新鮮な目で戻ってくると、解決策が目の前にあることに気付くでしょう。他の人に問題を説明してみることもできます。

問題がどこにあるのかわからない場合もありますが、これが発生した場合でも、まだ多くの選択肢があります。

たとえば、コードのブロックにコメントを付けて、問題を特定しようとする場合があります。

問題が解消された場合は、コメントしたコードの一部のコメントを解除できます。

これは非常にローテクなソリューションですが、まさに必要なものかもしれません。

ここまで到達しても何も役に立たないと思われる場合

大きな銃を抜く時が来ました。

役立つと思われるシステムツールをいくつか紹介します。

これらのツールの1つがWiresharkで、ネットワークトラフィックを検査できます。

SSL暗号化トラフィックを処理している場合は、mitmproxyのようなmitm(中間者)プロキシが役立つ可能性があります。

カールを試すこともできます 端末からHTTP接続を開始します。これは、無効なサーバー応答のデバッグに役立つ場合があります。

使い慣れているもう1つのツールは、strace(Linuxのみ)です。

Straceは、アプリが実行しているすべてのシステムコールを表示します。

-eオプションを使用して、特定のシステムコールをフィルタリングできます。 straceのより現代的な代替手段はsysdigです。

警告!テスト対象のシステムのパフォーマンスが大幅に低下するため、本番環境でのstraceの使用は避けてください。

最後に、外部のgemに起因しているように見える問題を扱っている場合、明らかな手順は、gemのソースコードを調べることです。

gem open を使用できます 設定したエディタでソースコードを開くコマンド。

結論

デバッグがこれまでで最も楽しいアクティビティではない場合でも、デバッグを簡単にするためのツールやテクニックがたくさんあります。それらを使用してください。

より多くのpplが学ぶことができるようにそれを楽しんだらこの投稿を共有してください! 🙂

ありがとうございます。


  1. 「ERR_CONTENT_DECODING_FAILED」エラーを修正する方法

    エラー「ERR_CONTENT_DECODING_FAILED 」はほとんどすべてのブラウザで見られます。特定のWebサイトの読み込み中にポップアップすることがありますが、新しいサーバーに移行したときに表示されることもあります。このエラーは、ページを数回更新した後も解決しません。この記事では、このエラーがトリガーされる理由のいくつかについて説明し、エラーを完全に根絶するための実行可能な解決策も提供します。 「ERR_CONTENT_DECODING_FAILED」エラーの原因は何ですか? 残念ながら、エラーがトリガーされた理由を1人の原因に特定することはできません。ただし、最も一般的な理由

  2. Windows PC でエラー 1722 を修正する方法

    エラー コード 1722 Windows 2003、2000、および XP で表示されます。 PC で実行されているアプリケーションが NetUserGetLocalGroup 関数にアクセスしようとすると発生します。 NetUserGetLocalGroup 関数は、基本的に、Windows NT ベースのオペレーティング システムに存在する「グループ ポリシー」の一部です。ユーザー アカウントとコンピューター アカウントの作業環境を管理します。 PC がこの機能を使用しようとすると、別のドメインの Active Directory を照会するために使用される可能性があります。このユーザー名