ありがとうございます.
この辺,考えていたんですが,

(1) event_hooks(イベントのリスト)は thread ごとではなく,
    VM 1つだけに持たせる
 (Thread ごとにフィルタするために,イベントにフィルタを設ける)

(2) event_hooks は thread ごとにもたせ,グローバルなモノは外す
 (グローバルなイベントは,全スレッドにコピー)

のどちらかにしようかなぁ,と考えています.

実は,誰も Thread#set_trace_func なんて使っていないような気がするので,
(1) で十分ではないか,と.

実際のところ,どうなんでしょうね?

(2012/10/21 19:24), ktsj (Kazuki Tsujimoto) wrote:
> 
> Issue #7032 has been updated by ktsj (Kazuki Tsujimoto).
> 
> 
> =begin
> SEGVする問題については、すでにトレースが実行されている場合は
> clean_hooksしないという形で修正しました。
> 
> "undefined local variable or method"となる問題はtrunkで
> 再現できないのでこのチケットはクローズします。
> 再発するようであれば新しくチケットを作りたいと思います。
> =end
> 
> ----------------------------------------
> Bug #7032: TestSetTraceFuncの実行に失敗する
> https://bugs.ruby-lang.org/issues/7032#change-31126
> 
> Author: ktsj (Kazuki Tsujimoto)
> Status: Closed
> Priority: Normal
> Assignee: 
> Category: 
> Target version: 
> ruby -v: ruby 2.0.0dev (2012-09-16 trunk 36980) [x86_64-linux]
> 
> 
> =begin
> 辻本です。
> 
> 以下のようにテストを実行すると、まれにTestSetTraceFuncの実行に失敗することがあります。
> 
>  $ make TESTS='-vq -j1 objspace/test_objspace.rb \
>                        json/test_json_fixtures.rb \
>                        json/test_json.rb \
>                        xmlrpc/test_marshal.rb \
>                        xmlrpc/test_features.rb \
>                        uri/test_parser.rb \
>                        uri/test_http.rb \
>                        uri/test_ftp.rb \
>                        uri/test_generic.rb \
>                        io/console/test_io_console.rb \
>                        rexml/test_stream.rb \
>                        rexml/test_light.rb \
>                        rexml/test_xpathtext.rb \
>                        rexml/test_xpath_pred.rb \
>                        rexml/test_rexml_issuezilla.rb \
>                        ruby/test_case.rb \
>                        ruby/test_hash.rb \
>                        ruby/test_marshal.rb \
>                        ruby/test_proc.rb \
>                        ruby/test_yield.rb \
>                        ruby/test_string.rb \
>                        ruby/test_settracefunc.rb' test-all
> 
> 失敗するケースは2つ確認していて、
> 1つめがRubyレベルで失敗するもの:
> 
>  TestSetTraceFunc#test_break = 0.00 s = .
>  TestSetTraceFunc#test_c_call = 0.00 s = .
>  TestSetTraceFunc#test_call = 0.00 s = .
>  TestSetTraceFunc#test_class = 0.00 s = .
>  TestSetTraceFunc#test_invalid_proc = 0.00 s = .
>  TestSetTraceFunc#test_raise = 0.00 s = .
>  TestSetTraceFunc#test_raise_in_trace = 0.00 s = .
>  TestSetTraceFunc#test_remove_in_trace = 0.00 s = .
>  TestSetTraceFunc#test_return = 0.00 s = .
>  TestSetTraceFunc#test_return2 = 0.00 s = .
>  /home/k_tsj/work/ruby/lib/test/unit/parallel.rb:40:in `rescue in block in _run_suite': undefined local variable or method `local_var' for #<Test::Unit::Worker:0x002aaaaaf8a5a0> (NameError)
>          xyzzy:2:in `eval'
>          xyzzy:2:in `block in trace_by_tracepoint'
>          /home/k_tsj/work/ruby/lib/test/unit/parallel.rb:40:in `rescue in block in _run_suite'
>          /home/k_tsj/work/ruby/lib/test/unit/parallel.rb:36:in `block in _run_suite'
> 
> 2つめがSEGVを起こすものになります。
> 
>  TestSetTraceFunc#test_break = 0.00 s = .
>  TestSetTraceFunc#test_c_call = 0.00 s = .
>  /home/k_tsj/work/ruby/lib/test/unit/parallel.rb:37: [BUG] Segmentation fault
>  ruby 2.0.0dev (2012-09-16 trunk 36980) [x86_64-linux]
>  
>  -- Control frame information -----------------------------------------------
>  c:0002 p:0045 s:0006 b:0005 e:000e40 BLOCK  /home/k_tsj/work/ruby/lib/test/unit/parallel.rb:37 [FINISH]
>  c:0001 p:---- s:0002 b:0002 e:000001 TOP    [FINISH]
>  
>  /home/k_tsj/work/ruby/lib/test/unit/parallel.rb:37:in `block in _run_suite'
> =end
> 
> 
> 


-- 
// SASADA Koichi at atdot dot net