撬:告诉我堆栈


101

当我在代码绑定中遇到断点时使用Pry in Rails.pry

我想知道我是怎么到达这里的,谁叫我,谁叫他们,等等。但是奇怪的是,我没有看到那个命令。有人知道吗?

Answers:


51

使用pry-stack_explorer插件,它允许您上下移动调用堆栈(使用updown),显示调用堆栈(使用show-stack),等等:

看这里:

Frame number: 0/64

From: /Users/johnmair/ruby/rails_projects/personal_site/app/controllers/posts_controller.rb @ line 7 PostsController#index:

    5: def index
    6:   @posts = Post.all
 => 7:   binding.pry
    8: end

[1] pry(#<PostsController>)> show-stack

Showing all accessible frames in stack (65 in total):
--
=> #0  index <PostsController#index()>
   #1 [method]  send_action <ActionController::ImplicitRender#send_action(method, *args)>
   #2 [method]  process_action <AbstractController::Base#process_action(method_name, *args)>
   #3 [method]  process_action <ActionController::Rendering#process_action(*arg1)>
<... clipped ...>

[2] pry(#<PostsController>)> up

Frame number: 1/64
Frame type: method

From: /Users/johnmair/.rvm/gems/ruby-2.0.0-p0/gems/actionpack-3.2.8/lib/action_controller/metal/implicit_render.rb @ line 4 ActionController::ImplicitRender#send_action:

    3: def send_action(method, *args)
 => 4:   ret = super
    5:   default_render unless response_body
    6:   ret
    7: end

[3] pry(#<PostsController>)> 

138

要在没有任何撬插件的情况下执行此操作(我在使用pry-stack_explorer时遇到了麻烦),只需看一下即可caller

我实际上是在寻找我的项目名称,以过滤掉所有不相关的Rails堆栈项目。例如,如果我使用的项目名称是archie

caller.select {|line| line.include? "archie" }

这给了我要寻找的堆栈跟踪。

较短的方法是:

caller.select {|x| x["archie"] }

哪个也一样。


1
这很棒。我很生气,因为它包含了撬调用堆栈,而我只是想从我的应用程序中特别得到什么。+1!
cdpalmer

6
完善。我在tmux中添加了一个键盘组合输入(绑定“ B”发送键“ ... ^ M”),使用“拒绝”代替,所以它更通用: caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide 2015年

4
按照Ruby社区的形式,唯一有用的答案是隐藏在安装一些插件的建议下。
Jesse Dhillon

4
这个答案值得很多赞扬。是的,您可以在撬棒上安装更多的东西。但是您也可以使用ruby的现有语言功能来达到尽可能远的距离(肯定足以回答OP的问题!)
amenthes

1
这个答案应该是正确的答案,因为它不需要其他插件!
Alvaro Cavalcanti,

83

pry-backtrace,它显示了Pry会话的回溯。

还有wtf吗?。哪个节目是最新异常的回溯。添加更多问号以查看更多回溯记录,或添加感叹号以查看所有内容。

在pry中键入help以查看所有其他命令:)


1
pry-backtrace可以,但是pry-stack_explorer插件功能更强大(尽管它是另一个宝石,一个插件)
horseyguy

7
但事实是有时您不使用所有这些功能:)
Dzung Nguyen 2014年


0

扩展Paul Oliver的答案。

如果您有要永久排除的短语列表,可以使用Pry中的自定义命令功能来实现。

~/.pryrc

Pry::Commands.block_command "callerf", "Filter the caller backtrace" do
  output = caller.reject! { |line| line["minitest"] || line["pry"] } 
  puts "\e[31m#{output.join("\n")}\e[0m"
end

调用callerf将导致过滤caller输出。周围出现奇怪的迹象,涂上了#{output}彩色的颜料来复制原来的外观caller。我从这里取了颜色。

另外,如果您不想执行自定义命令,请使用Ctrl+R来搜索命令历史记录。


在主文件夹中~/.pryrc。如果没有,只需创建它。~/在Unix系统上始终表示主文件夹。
sloneorzeszki
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.