Pry : 스택보기


101

코드 바인딩에서 중단 점에 도달했을 때 Rails에서 Pry를 사용합니다.

내가 여기에 어떻게 왔는지, 누가 전화했는지, 누가 전화했는지 등을 알고 싶습니다.하지만 이상하게도 그 명령이 보이지 않습니다. 아는 사람 있나요?

답변:


51

사용 놀리려는-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 플러그인없이이 작업을 수행하려면 (pry-stack_explorer에 문제가 있음) caller.

실제로 관련없는 모든 레일 스택 항목을 필터링하기 위해 프로젝트 이름을 찾습니다. 예를 들어 내 프로젝트 이름이 다음과 같으면 archie다음을 사용합니다.

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

내가 찾고있는 스택 추적을 제공합니다.

더 짧은 방법은 다음과 같습니다.

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

잘 작동합니다.


1
이것은 훌륭합니다. 나는 pry 호출 스택을 포함했기 때문에 짜증이 났고 내 응용 프로그램에서 구체적으로 나오는 것을 원했습니다. +1!
cdpalmer

6
완전한. 내가 대신 그래서 더 일반적인이다 "거부"를 사용하여,이 (바인드 'B'전송 - 키 '... ^ M')을 입력 TMUX하는 키 콤보를 추가 : caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
hoodslide

4
Ruby 커뮤니티를위한 형식으로, 유용한 답변은 일부 플러그인을 설치하라는 조언 아래에 묻혀 있습니다.
Jesse Dhillon

4
이 답변은 많은 찬성 투표를받을 가치가 있습니다. 예, pry 위에 더 많은 것을 설치할 수 있습니다 . 하지만 루비의 기존 언어 기능을 사용하여 거의 모든 작업을 수행 할 수 있습니다 (확실히 OP의 질문에 답할만큼 충분히 멀리!)
amenthes

1
추가 플러그인이 필요하지 않으므로이 답변은 올바른 답변이어야합니다!
Alvaro Cavalcanti 2011

83

놀리려는-역 추적 하는보기 올립니다 세션에 대한 역 추적의는.

또한이 무슨 일? . 어느 쇼가 가장 최근 예외의 역 추적입니다. 역 추적을 더 많이 보려면 물음표를 더 추가하고 모든 것을 보려면 느낌표를 추가하십시오.

다른 모든 명령을 보려면 pry에 help 를 입력 하십시오. :)


1
pry-backtrace좋아,하지만 pry-stack_explorer플러그인은 방법이 더 강력하다 (이것은 다른 보석, 플러그인 비록)
horseyguy

7
하지만 사실은 당신이 모든 기능 : 사용하지 않는 때때로
Dzung 응우 엔

1

gem 라이브러리 내에 이미 정의 된 호출자 메서드를 사용할 수 있습니다. 해당 메서드의 반환 값은 배열이됩니다. 따라서 해당 행에서 검색을 위해 배열 메서드를 이벤트 적용 할 수 있습니다.

아래는 강력한 추적에도 도움이됩니다. https://github.com/pry/pry-stack_explorer


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.