openSUSE:WebYaST技巧

跳转到:导航搜索

调试 Ruby on Rails 应用程序


Ruby 有一个集成的调试器,类似于 gdb

安装 Ruby 调试器

Ruby 调试器在 ruby-debug Ruby gem 中可用。可以使用以下命令安装

 sudo gem install ruby-debug

它还将安装所有依赖的 Ruby gem。(注意:目前没有可用的 RPM 包)。

启动调试器

从 Rails 应用程序启动

首先,需要在应用程序中标记调试器将启动的位置,使用 debugger 关键字。

然后,必须在调试环境中启动应用程序 - 这很简单,只需使用启动脚本的 --debugger 选项,例如使用

 script/server --debugger

命令启动 Rails 应用程序,输出将如下所示

 => Booting WEBrick
 => Rails 2.3.2 application starting on http://0.0.0.0:8080
 /webservice/config/environment.rb
 Registering plugin resources
 => Debugger enabled
 => Call with -d to detach
 => Ctrl-C to shutdown server


在 Rails 启动时启动

有时,即使在加载 Rails 组件之前,也需要调试器,例如,如果问题发生在加载 Rails 组件时。在这种情况下,使用命令

 rdebug script/server -- -p 3000 --debugger

直接在调试器中启动应用程序。(注意双破折号字符串,它结束 rdebug 选项)。

Rails 加载代码非常复杂,如果可能的话,应该使用第一种方法,否则您将花费太多时间浏览庞大的 Rails 加载代码。

使用调试器

当应用程序执行 debugger 命令时,它会停止,并且在启动应用程序的终端中会打开一个调试会话。

最重要的基本命令

l (line) - 打印源代码脚本(l= 打印当前行)
c (continue) - 继续应用程序,退出调试器
bt (backtrace) - 打印执行堆栈(调用了哪些函数)
n (next) - 执行下一条命令
s (step) - 执行下一条命令,进入函数
v (var) - 显示变量(v l 打印局部变量,v g 打印全局变量)
h (help) - 列出更多可用命令及其详细信息

此外,可以使用标准的 Ruby 命令来打印或检查当前对象,例如使用 object.classobjec.inspect 方法。还可以修改当前变量,只需使用 var = value 命令。

更多链接

http://blog.nanorails.com/articles/2006/7/14/a-better-rails-debugger-ruby-debug

使用 GDB 附加到 Ruby 进程

如果您需要附加到正在运行的 Rails(或通常的 Ruby)应用程序,可以使用 GDB 调试器。当您的应用程序停止响应但仍在运行时,并且无法启动 debugger 命令时,这是必需的。

GDB 不直接支持 Ruby 调试,但有一些宏可以使其变得容易。有关更多信息,请参阅 检查实时 Ruby 进程 页面。


有用的 Firefox 插件


FireBug 插件

Firebug 插件 允许检查、调试和编辑显示的页面。它具有集成的 CSS 和 DOM 浏览器。对于 Web 开发人员来说,这是必备品!


Screengrab

Screengrab 将显示的页面保存为图像(保存到文件或剪贴板)。在报告布局问题时,非常有用,因为它能够保存完整的页面(即使是当前不可见的部分)。它还可以仅保存可见部分或用户选择的部分。


使用 curl 发送 REST API 请求


在 Web 浏览器中测试 REST API 非常有限,没有 UI(表单),只能发送 GET 请求。无法发送 PUT 或 POST 请求。

但是,我们可以使用 curl 在没有 Web 客户端 UI 的情况下测试 REST API。


身份验证

主要问题是身份验证 - REST API 在任何请求之前都需要登录。

有这些可能性

  1. 将用户名和密码直接放在每个 curl 命令中
    curl -u <user>:<password> https://:8080/services.xml
  2. 仅使用用户名选项,curl 将在终端上询问密码
    curl -u <user> https://:8080/services.xml
    (这更安全,密码不会存储在 shell 历史记录中,也不会在终端上可见。)
  3. 可能最好的解决方案:登录并将授权 cookie 保存到文件(在本例中为 cookie.txt
    curl -u <user> -c cookie.txt https://:8080/login
    然后在所有后续调用中使用 cookie
    curl -b cookie.txt https://:8080/services.xml


GET 请求

GET 请求很简单,GET 是默认值。请参阅上一段中的示例。


PUT/POST/DELETE 请求

可以使用 -X PUT 选项发送 PUT 请求,可选地使用 -d 选项后跟参数。

示例 curl -d 'execute=start' -b cookie.txt -X PUT https://:8080/services/ntp.xml

这等效于curl -b cookie.txt -X PUT https://:8080/services/ntp.xml?execute=start


要发送 XML 输入文件,请使用 -H 选项(设置 XML 内容类型),并在 -d 选项中使用 @ 前缀设置输入文件

示例 curl -b cookie.txt -X PUT -H 'Content-type: text/xml' -d @inputfile.xml https://:8080/system


参数也可以设置为 json 格式的参数

示例 curl -b cookie.txt -X PUT -H 'Content-type: text/x-json' -d "{'routes':{'via':'1.2.3.4', 'id':'default'}}" https://:8080/network/routes/default


对于 DELETE 或 POST 请求,只需更改 -X 选项中的参数即可。