2023/2/27
Ruby Association Grant Targets
Developing Pf2
✅ Simultaneous observation of multiple Ruby Threads
✅ Improved visualization
✅ Automated testing
✅ GVL observation
✅ When did the Thread acquire the lock?
Contention information
How long are Threads waiting for the lock?
GC observation
✅ Markers
今回の進捗
やった
RubyKaigi accepted!
Vernier を作ってる jhawthorn も来るらしい
Datadog 勢とも話せると良さそう
pf2 run -- ruby script.rb 対応
便利!!
RUBYOPT="-r pf2/run" してるだけ
code:run
% be pf2 run -- bundle exec ruby script.rb
Pf2 listening on localhost:51502. Hit Ctrl-C to quit.
i'm the script!
↑ のために fork() 対応した
bundle exec で実行されてると bundler を観察することになって全然うれしくない
bundle exec に関しては無視する対応を入れた
多分できた……
track_new_threads: true の場合だけ、pthread_atfork() でタイマーを登録しなおしてるだけ
Ruby stack と Native stack のマージ(中間部分について)
スタックを比較するだけではマージできない気がしている……
ISeqを積む命令は4つだけ
send
opt_send_without_block
invokesuper
invokeblock
vm_exec_core から呼んだ Cfunc から Ruby のメソッドを呼んだとき
rb_foo() と Kernel#foo の対応づけ
rb_foo() のアドレスが分かればどうにかなる?
cme (rb_method_callable_entry_t) のテーブル
VMのフレームに cme へのポインタが入っている
VMのフレームとは?
cfp
vm_push_frame (insnhelper.c) の中での ep の操作を見たら分かる
cref_or_me のポインタをコピーしておけばいい
最適化が起こっている場合のコーナーケース
Hash#[] の場合、専用の opt_aref 命令 (rb_hash_aref を呼ばない) につぶされることがある
この場合 Native stack に rb_hash_aref は出現しない
Ruby のスタックフレームも push されない
最適化の有無でそもそも Ruby のバックトレースの形が変わっている
例えば Integer#+ (opt_plus) はバックトレースに出現しないがち
↑ のような場合、2つの vm_exec_core() の間で(概念上は存在する Ruby Method が)見えない
やってる