From: Nobuyoshi Nakada Date: 2010-01-10T04:30:00+09:00 Subject: [ruby-dev:40008] Re: yuguiさんのvm_probesのsystemtap対応 なかだです。 At Sun, 10 Jan 2010 03:28:52 +0900, KOSAKI Motohiro wrote in [ruby-dev:40006]: > [ruby-core:27448] [Feature:trunk] adding hooks for better tracing > でアナウンスされたDTraceパッチですが > 以下のような変更を加えることによりSystemTapでも動くことを確認しました。 OS Xでもuniversal binaryに対応していないようだったのでパッチです。 diff --git a/depend b/depend index ec2a9e8..bb7a712 100644 --- a/depend +++ b/depend @@ -1,11 +1,9 @@ -vm_probes.o: tracing_mechanism.h -tracing_mechanism.h: $(TRACING_MECHANISM)_probes.h mkmf.log - cp $(TRACING_MECHANISM)_probes.h $@ +vm_probes.o: $(TRACING_MECHANISM)_probes.h dtrace_probes.h: dtrace.h dtrace.h: dtrace.d mkmf.log - $(DTRACE) -h $(ARCH_FLAGS) -o dtrace.h -s dtrace.d -dtrace.$(OBJEXT): $(ORIG_OBJS) dtrace.d mkmf.log - $(DTRACE) -G $(ARCH_FLAGS) -o $@ -s dtrace.d $(ORIG_OBJS) + $(DTRACE) -h $(ARCH_FLAG) -o dtrace.h -s dtrace.d +dtrace.o: $(ORIG_OBJS) dtrace.d mkmf.log + $(DTRACE) -G $(ARCH_FLAG) -o $@ -s dtrace.d $(ORIG_OBJS) dtrace.d: dtrace.d.erb mkmf.log echo 'please re-run extconf.rb' diff --git a/extconf.rb b/extconf.rb index 6b56239..6f8b5a3 100644 --- a/extconf.rb +++ b/extconf.rb @@ -4,13 +4,13 @@ autoload :ERB, 'erb' DTRACE = 'dtrace' -ARCH=$configure_args['with-arch'] def choose_mechanism - case mechanism = $configure_args['tracing-mechanism'] + mechanism = case RUBY_PLATFORM when /linux/; 'systemtap'; end + case mechanism = with_config('tracing-mechanism', mechanism) when 'dtrace', nil mechanism = 'dtrace' begin $objs = %w[ vm_probes.o ] - $objs << 'dtrace.o' if dtrace_needs_postprocessor?(ARCH) + $objs << 'dtrace.o' if dtrace_needs_postprocessor? rescue message "something wrong in checking dtrace. see mkmf.log\n" @@ -19,4 +19,7 @@ def choose_mechanism end create_dtrace_d + when 'systemtap' + $objs = %w[ vm_probes.o dtrace.o ] + create_dtrace_d else message "unknown tracing mechanism #{mechanism}" @@ -37,8 +40,8 @@ def create_dtrace_d end -def dtrace_needs_postprocessor?(arch) +def dtrace_needs_postprocessor? return $dtrace_needs_postprocessor unless $dtrace_needs_postprocessor.nil? - arch_arg = "--arch=#{arch}" if arch - Tempfile.open("conftest.d"){|f| + arch_arg = "$(ARCH_FLAG)" + Tempfile.open(%w[conftest .d]){|f| f.puts <<-EOS provider conftest { @@ -95,5 +98,4 @@ def prepend_variables(mechanism) f.puts "DTRACE=#{DTRACE}" f.puts "TRACING_MECHANISM=#{mechanism}" - f.puts "ARCH_FLAGS=--arch #{ARCH}" if ARCH orig_objs = $objs.select{|x| x != "#{mechanism}.o"} @@ -105,4 +107,5 @@ end mechanism = choose_mechanism +$defs << %[-DTRACING_PROBES_H=\\"#{mechanism}_probes.h\\"] create_makefile('vm_probes') prepend_variables(mechanism) diff --git a/vm_probes.c b/vm_probes.c index 4f71743..126521e 100644 --- a/vm_probes.c +++ b/vm_probes.c @@ -1,4 +1,4 @@ #include -#include "tracing_mechanism.h" +#include TRACING_PROBES_H #define ALL_EVENTS (RUBY_EVENT_LINE \ @@ -11,5 +11,5 @@ static void -event_hook(rb_event_flag_t flags, VALUE data, VALUE obj, VALUE id, VALUE klass) +event_hook(rb_event_flag_t flags, VALUE data, VALUE obj, ID id, VALUE klass) { if ((flags & RUBY_EVENT_LINE) && TRACE_LINE_ENABLED()) { -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦