Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ruby Debugger API
Search
Dennis Ushakov
November 23, 2013
Technology
0
130
Ruby Debugger API
Ruby Debugger API overview with
Dennis Ushakov
November 23, 2013
Tweet
Share
More Decks by Dennis Ushakov
See All by Dennis Ushakov
Ruby Debugger Internals
denofevil
1
70
RubyMine and RubyMotion
denofevil
0
50
RubyMotion #JetBrainsDay
denofevil
0
42
Get More from RubyMotion with RubyMine
denofevil
0
49
Fighting Code Smells #FrozenRails
denofevil
0
59
Other Decks in Technology
See All in Technology
~Everything as Codeを諦めない~ 後からCDK
mu7889yoon
3
290
小さく始めるBCP ― 多プロダクト環境で始める最初の一歩
kekke_n
1
360
2人で作ったAIダッシュボードが、開発組織の次の一手を照らした話― Cursor × SpecKit × 可視化の実践 ― Qiita AI Summit
noalisaai
1
370
GSIが複数キー対応したことで、俺達はいったい何が嬉しいのか?
smt7174
3
150
なぜ今、コスト最適化(倹約)が必要なのか? ~AWSでのコスト最適化の進め方「目的編」~
htan
1
110
Bill One急成長の舞台裏 開発組織が直面した失敗と教訓
sansantech
PRO
2
310
コスト削減から「セキュリティと利便性」を担うプラットフォームへ
sansantech
PRO
3
1.4k
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
2
620
Frontier Agents (Kiro autonomous agent / AWS Security Agent / AWS DevOps Agent) の紹介
msysh
3
150
ファインディの横断SREがTakumi byGMOと取り組む、セキュリティと開発スピードの両立
rvirus0817
1
1.2k
Deno・Bunの標準機能やElysiaJSを使ったWebSocketサーバー実装 / ラーメン屋を貸し切ってLT会! IoTLT 2026新年会
you
PRO
0
300
SREが向き合う大規模リアーキテクチャ 〜信頼性とアジリティの両立〜
zepprix
0
410
Featured
See All Featured
Paper Plane (Part 1)
katiecoart
PRO
0
4k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
How to Talk to Developers About Accessibility
jct
2
130
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
200
A better future with KSS
kneath
240
18k
GraphQLの誤解/rethinking-graphql
sonatard
74
11k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
180
Git: the NoSQL Database
bkeepers
PRO
432
66k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.6k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
450
Rails Girls Zürich Keynote
gr2m
96
14k
Transcript
Ruby Debugger API Dennis Ushakov or how I stopped worrying
and wrote debugger core
Sample Program MAGIC_NUMBER = 10000000 ! def is_anybody_out_there? "Is anybody
out there?" end ! def hardcore_action MAGIC_NUMBER.times { is_anybody_out_there? } end
Sample Program MAGIC_NUMBER = 10000000 ! def is_anybody_out_there? "Is anybody
out there?" end ! def hardcore_action MAGIC_NUMBER.times { is_anybody_out_there? } end 3.45s
set_trace_func set_trace_func proc { |event,file,line,id,binding,classname| }
Event Types • line • call & return • c-call
& c-return • class & end • raise • b-call & b-return — Ruby 2.0 • thread-begin & thread-end — Ruby 2.0
Binding • Kernel.binding • execution context (variables, methods)
Sample Output line debug_bench.rb:22 call debug_bench.rb:10 hardcore_action Object line
debug_bench.rb:11 hardcore_action Object c-call debug_bench.rb:11 times Integer line debug_bench.rb:11 hardcore_action Object call debug_bench.rb:6 is_anybody_out_there? Object line debug_bench.rb:7 is_anybody_out_there? Object return debug_bench.rb:8 is_anybody_out_there? Object c-return debug_bench.rb:11 times Integer return debug_bench.rb:12 hardcore_action Object line debug_bench.rb:23
Sample Output line debug_bench.rb:22 call debug_bench.rb:10 hardcore_action Object line
debug_bench.rb:11 hardcore_action Object c-call debug_bench.rb:11 times Integer line debug_bench.rb:11 hardcore_action Object call debug_bench.rb:6 is_anybody_out_there? Object line debug_bench.rb:7 is_anybody_out_there? Object return debug_bench.rb:8 is_anybody_out_there? Object c-return debug_bench.rb:11 times Integer return debug_bench.rb:12 hardcore_action Object line debug_bench.rb:23 61.73s
set_trace_func set_trace_func proc { |event,file,line,id,binding,classname| }
set_trace_func set_trace_func proc { |event,file,line,id,binding,classname| } 58.33s
rb_add_event_hook void rb_add_event_hook( rb_event_hook_func_t func, rb_event_flag_t events, VALUE data );
event_hook gem • If there’s a C API there should
be a wrapper gem for it • Well, no
event_hook gem • With empty processing Ruby method 31.46s •
With empty processing C method 6.48s
Ruby 2.0: moar API • TracePoint • debug_inspector
Ruby 2.0: TracePoint trace = TracePoint.new(*events) do |tp| end trace.enable
Ruby 2.0: TracePoint trace = TracePoint.new do |tp| end trace.enable
18.27s
Ruby 2.0: TracePoint trace = TracePoint.new do |tp| tp.binding end
trace.enable 70.20s
Performance summary • run 3.45s • set_trace_func 61.73s • binding
58.33s • rb_add_event_hook • Ruby callback 31.46s • C callback 6.48s • TracePoint 18.27s
Under the hood • Everyone is using rb_add_event_hook
Ruby 2.0: debug_inspector VALUE rb_debug_inspector_open( rb_debug_inspector_func_t func, void *data );
debug_inspector gem • If there’s a C API there should
be a wrapper gem for it that’s obsolete • Well, no
debug_inspector gem RubyVM::DebugInspector.open { |dc| locations = dc.backtrace_locations locations.size.times do
|i| p dc.frame_binding(i) p dc.frame_iseq(i) p dc.frame_class(i) end }
Usages • set_trace_func • ruby -r debug.rb • rb_add_event_hook •
ruby-debug-base/debugger • rcov
Usages • TracePoint + DebugInspector • debase • byebug •
binding_of_caller
What seems to be the problem, officer?
line te.rb:9 call te.rb:5 m1 9 if m1 line te.rb:5
m1 10 1 return te.rb:5 m1 11 elsif m2 call te.rb:6 m2 12 2 line te.rb:6 m2 13 end return te.rb:6 m2 line te.rb:12 Catch me if you can
That’s it
en_Dal
[email protected]
denofevil
JRuby • org.jruby.runtime.EventHook • public boolean isInterestedInEvent(RubyEvent event) • public
void eventHandler( ThreadContext tCtx, String event, String file, int line, String methodName, IRubyObject klass )