hor*_*guy 138
安装途径:
$ gem install pry
$ pry
Run Code Online (Sandbox Code Playgroud)
然后加:
require 'pry'; binding.pry
Run Code Online (Sandbox Code Playgroud)
进入你的程序.
ger*_*nux 113
在Ruby中:
ruby -rdebug myscript.rb
Run Code Online (Sandbox Code Playgroud)
然后,
b <line>
:放点断点 n(ext)
或s(tep)
与c(ontinue)
p(uts)
用于显示(比如perl调试)
在Rails中:使用启动服务器
script/server --debugger
Run Code Online (Sandbox Code Playgroud)
并添加debugger
代码.
edx*_*edx 56
作为栏杆推荐:使用撬!我只能就此达成一致.
pry是比irb更好的代表.
你需要添加
require 'pry'
Run Code Online (Sandbox Code Playgroud)
到您的源文件,然后通过添加在源代码中插入断点
binding.pry
Run Code Online (Sandbox Code Playgroud)
在您想要查看事物的地方(这就像在经典IDE环境中触发断点)
一旦你的程序击中了
binding.pry
Run Code Online (Sandbox Code Playgroud)
在你的程序的所有上下文中,你将直接进入pry repl,这样你就可以简单地探索周围的一切,调查所有对象,改变状态,甚至动态更改代码.
我相信你不能改变你当前所处方法的代码,所以你可以遗憾地不改变下一行的执行.但无论如何,好的红宝石代码往往是单行;-)
Kel*_*nan 31
调试通过提高例外是容易得多不是通过眯眼print
日志语句,对于大多数的错误,它通常快得多比打开了一个IRB调试像pry
或byebug
.这些工具不应该是你的第一步.
Exception
当时.inspect
及其结果调试Ruby(尤其是Rails)代码的最快方法是raise
在调用.inspect
方法或对象时沿代码的执行路径发生异常(例如foo
):
raise foo.inspect
Run Code Online (Sandbox Code Playgroud)
在上面的代码,raise
触发Exception
该停止代码的执行,并返回一个包含方便的错误信息.inspect
有关的对象/方法(即信息foo
在你试图调试的线).
这种技术对于快速检查对象或方法(例如是nil
吗?)以及立即确认在给定的上下文中是否甚至完全执行代码行是有用的.
byebug
pry
只有在获得有关代码执行流程状态的信息后,才应考虑转移到ruby gem irb调试器,pry
或者byebug
在哪里可以深入研究执行路径中对象的状态.
当您尝试调试问题时,总是建议: 阅读!@#$ ing错误消息(RTFM)
这意味着在行动之前仔细和完整地阅读错误消息,以便您了解它试图告诉您的内容. 调试时,请在阅读错误消息时按此顺序询问以下心理问题:
nil
?) 在堆栈跟踪中,要特别注意来自项目的代码行(例如,app/...
如果您使用Rails,则以行开头).99%的时间问题出在你自己的代码上.
为了说明为什么这个顺序的解释很重要......
您执行在某些时候执行的代码:
@foo = Foo.new
...
@foo.bar
Run Code Online (Sandbox Code Playgroud)
并且您收到一条错误消息:
undefined method "bar" for Nil:nilClass
初学者看到这个错误,并认为问题是该方法bar
是未定义的.不是.在这个错误中,重要的真实部分是:
for Nil:nilClass
for Nil:nilClass
意思@foo
是没有! @foo
不是Foo
实例变量!你有一个对象Nil
.当你看到这个错误时,它只是ruby试图告诉你bar
该类的对象不存在该方法Nil
.(好吧!因为我们正在尝试使用一种方法来处理类的对象而Foo
不是Nil
).
不幸的是,由于这个错误是如何编写的(undefined method "bar" for Nil:nilClass
)很容易让人误以为这个错误与bar
存在有关undefined
.如果没有仔细阅读,这个错误会导致初学者错误地深入研究bar
方法的细节Foo
,完全错过了提示该对象属于错误类的错误部分(在本例中为nil).通过完整阅读错误消息可以轻松避免这个错误.
摘要:
在开始任何调试之前,请务必仔细阅读整个错误消息.这意味着:始终检查类中的错误消息类型的对象的第一,那么它的方法,前开始侦探到任何堆栈跟踪或代码行,你认为该错误可能发生.那5秒钟可以为你节省5个小时的挫败感.
tl; dr:不要斜视打印日志:改为异常.在调试之前仔细阅读错误,避免兔子漏洞.
And*_*imm 20
尽可能打印出变量.(这称为printf调试)您可以通过运行来完成此操作
STDERR.puts x.inspect
Run Code Online (Sandbox Code Playgroud)
要么
STDERR.puts "Variable x is #{x.inspect}"
Run Code Online (Sandbox Code Playgroud)
如果你想让这更容易输入,那么你可能想要使用exemplor gem.
打开警告.如果您正在运行,ruby
则使用-w
开关(例如ruby -w script.rb
)运行它.如果您从irb运行它,并且您在1.9.2之前使用的是ruby版本,请$VERBOSE = true
在会话开始时键入.如果拼错了一个实例变量,一旦出现警告,你就会得到
警告:实例变量
@valeus
未初始化
理解二进制文章的概念(以下引用来自敏捷开发人员的实践)
将问题空间分成两半,看看哪一半包含问题.然后再将这一半分成两半,然后重复.
如果你成功使用二进制印章,你可能会发现有一行不符合你的预期.例如
[1, 2, 3].include?([1,2])
Run Code Online (Sandbox Code Playgroud)
给出一个值false
,即使你认为它会回来true
.在这种情况下,您可能需要查看文档.文档的网站包括ruby-doc.org或APIdock.在后一种情况下,你要include?
在右上角附近的放大镜旁边键入,选择include?
它Array
下面的放大镜(如果你不知道是什么类[1, 2, 3]
,输入[1, 2, 3].class
irb),你可以包含?(数组),描述它的作用.
但是,如果文档没有帮助,如果您可以询问特定行如何不应该做的事情,那么您更有可能得到一个好的答案,而不是为什么整个脚本没有做什么这应该.
删除所有的东西
欢迎来到2017 ^ _ ^
好的,所以如果您不反对尝试新的IDE,您可以免费执行以下操作.
launch.json
要使用的"cwd"
和和 "program"
字段{workspaceRoot}
"showDebuggerOutput"
并将其设置为true
"debug.allowBreakpointsEverywhere": true
vscode
; 这与Visual Studio不同.它是免费的,重量轻的,并且通常是积极的.View->Extensions
.vscode
,在那里我们只会调用一个文件launch.json
,我们将在那里存储一些配置选项.
launch.json
内容
{
"version": "0.2.0",
"configurations":
[
{
"name": "Debug Local File",
"type":"Ruby",
"request": "launch",
"cwd": "${workspaceRoot}",
"program": "{workspaceRoot}/../script_name.rb",
"args": [],
"showDebuggerOutput": true
}
]
}
File->Preferences->Settings
(或Ctrl,)并滚动,直到您到达该Debug
部分.展开它并查找一个名为的字段"debug.allowBreakpointsEverywhere"
- 选择该字段并单击小铅笔图标并将其设置为true
.完成所有有趣的事情之后,您应该能够在2017年中期的类似菜单中设置断点和调试以及更暗的主题: 所有有趣的东西,如你的调用堆栈,变量查看器等.
最大的PITA是1)安装pre-reqs和2)记住配置.vscode\launch.json
文件.只有#2应该将任何行李添加到未来的项目中,您只需复制一个通用的配置,就像上面列出的那样.可能有更一般的配置位置,但我不知道我的头脑.
所有其他答案已经提供了几乎所有的东西......只是一点点补充
如果你想要一些类似IDE的调试器(非CLI)并且不怕使用Vim作为编辑器,我建议使用Vim Ruby Debugger插件.
它的文档非常简单,请点击链接查看.简而言之,它允许您在编辑器中的当前行设置断点,在暂停时在漂亮的窗口中查看局部变量,逐步进入/进入 - 几乎所有常用的调试器功能.
对我来说,使用这个vim调试器调试Rails应用程序非常有趣,尽管Rails的丰富记录器功能几乎消除了对它的需求.
我刚发现这个宝石(将Pry变成MRI Ruby 2.0+的调试器)
https://github.com/deivid-rodriguez/pry-byebug
gem install pry-byebug
Run Code Online (Sandbox Code Playgroud)
-w
(警告)标志我强烈推荐这个视频,以便选择适当的工具来调试我们的代码.
https://www.youtube.com/watch?v=GwgF8GcynV0
就个人而言,我将在本视频中重点介绍两个重要主题.
那是我的两分钱!
要轻松调试Ruby shell脚本,只需更改其第一行:
#!/usr/bin/env ruby
Run Code Online (Sandbox Code Playgroud)
至:
#!/usr/bin/env ruby -rdebug
Run Code Online (Sandbox Code Playgroud)
然后每次显示调试器控制台时,您都可以选择:
c
for Continue(到下一个Exception,断点或带有:)的行debugger
,n
对于下一行,w
/ where
显示帧/调用堆栈,l
显示当前代码,cat
显示抓点.h
获得更多帮助.另请参阅:使用ruby-debug进行调试,ruby-debug gem的密钥快捷方式.
如果脚本挂起并且您需要回溯,请尝试使用lldb
/ gdb
like:
echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)
Run Code Online (Sandbox Code Playgroud)
然后检查您的进程前景.
替换lldb
为gdb
if工作得更好.sudo
用于调试非自有进程的前缀.
从Ruby 2.4.0开始,在任何Ruby程序的中间启动IRB REPL会话都更加容易。将这些行放在要调试的程序中:
require 'irb'
binding.irb
Run Code Online (Sandbox Code Playgroud)
您可以运行Ruby代码并打印出局部变量。输入Ctrl + D或quit
结束REPL,让Ruby程序继续运行。
您还可以在程序运行时使用puts
和p
打印出程序中的值。
归档时间: |
|
查看次数: |
153900 次 |
最近记录: |