ruby-usdt 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,65 @@
1
+ /*
2
+ * Stub functions containing DTrace tracepoints for probes and
3
+ * is-enabled probes. These functions are copied for each probe
4
+ * dynamically created.
5
+ *
6
+ */
7
+ .text
8
+
9
+ .align 4, 0x90
10
+ .globl usdt_tracepoint_isenabled
11
+ .globl _usdt_tracepoint_isenabled
12
+ .globl usdt_tracepoint_probe
13
+ .globl _usdt_tracepoint_probe
14
+ .globl usdt_tracepoint_end
15
+ .globl _usdt_tracepoint_end
16
+ .globl usdt_probe_args
17
+ .globl _usdt_probe_args
18
+
19
+ usdt_tracepoint_isenabled:
20
+ _usdt_tracepoint_isenabled:
21
+ pushl %ebp
22
+ movl %esp, %ebp
23
+ subl $8, %esp
24
+ xorl %eax, %eax
25
+ nop
26
+ nop
27
+ leave
28
+ ret
29
+ usdt_tracepoint_probe:
30
+ _usdt_tracepoint_probe:
31
+ nop
32
+ nop
33
+ nop
34
+ nop
35
+ nop
36
+ addl $0x20,%esp
37
+ leave
38
+ usdt_tracepoint_end:
39
+ _usdt_tracepoint_end:
40
+ ret
41
+
42
+ /*
43
+ * Probe argument marshalling, i386 style
44
+ *
45
+ */
46
+
47
+ usdt_probe_args:
48
+ _usdt_probe_args:
49
+ pushl %ebp
50
+ movl %esp,%ebp
51
+ subl $8,%esp
52
+ subl $8,%esp
53
+ movl 8(%ebp),%ebx
54
+ movl 0xc(%ebp),%ecx
55
+ test %ecx,%ecx
56
+ je fire
57
+ args: movl %ecx,%eax
58
+ sal $2,%eax
59
+ subl $4,%eax
60
+ addl 0x10(%ebp),%eax
61
+ pushl (%eax)
62
+ dec %ecx
63
+ jne args
64
+ fire: jmp *%ebx
65
+
@@ -0,0 +1,83 @@
1
+ /*
2
+ * Stub functions containing DTrace tracepoints for probes and
3
+ * is-enabled probes. These functions are copied for each probe
4
+ * dynamically created.
5
+ *
6
+ */
7
+ .text
8
+
9
+ .align 4, 0x90
10
+ .globl usdt_tracepoint_isenabled
11
+ .globl _usdt_tracepoint_isenabled
12
+ .globl usdt_tracepoint_probe
13
+ .globl _usdt_tracepoint_probe
14
+ .globl usdt_tracepoint_end
15
+ .globl _usdt_tracepoint_end
16
+ .globl usdt_probe_args
17
+ .globl _usdt_probe_args
18
+
19
+ usdt_tracepoint_isenabled:
20
+ _usdt_tracepoint_isenabled:
21
+ pushq %rbp
22
+ movq %rsp, %rbp
23
+ xorq %rax, %rax
24
+ nop
25
+ nop
26
+ leave
27
+ ret
28
+ usdt_tracepoint_probe:
29
+ _usdt_tracepoint_probe:
30
+ nop
31
+ nop
32
+ nop
33
+ nop
34
+ nop
35
+ popq %r11
36
+ popq %rbx
37
+ popq %r12
38
+ addq $0x18,%rsp
39
+ leave
40
+ usdt_tracepoint_end:
41
+ _usdt_tracepoint_end:
42
+ ret
43
+
44
+ /*
45
+ * Probe argument marshalling, x86_64 style
46
+ *
47
+ */
48
+
49
+ usdt_probe_args:
50
+ _usdt_probe_args:
51
+ pushq %rbp
52
+ movq %rsp,%rbp
53
+ subq $0x18,%rsp
54
+ pushq %r12
55
+ pushq %rbx
56
+ pushq %r11
57
+ movq %rdi,%r12
58
+ movq %rsi,%rbx
59
+ movq %rdx,%r11
60
+ test %rbx,%rbx
61
+ je fire
62
+ movq (%r11),%rdi
63
+ dec %rbx
64
+ test %rbx,%rbx
65
+ je fire
66
+ movq 8(%r11),%rsi
67
+ dec %rbx
68
+ test %rbx,%rbx
69
+ je fire
70
+ movq 16(%r11),%rdx
71
+ dec %rbx
72
+ test %rbx,%rbx
73
+ je fire
74
+ movq 24(%r11),%rcx
75
+ dec %rbx
76
+ test %rbx,%rbx
77
+ je fire
78
+ movq 32(%r11),%r8
79
+ dec %rbx
80
+ test %rbx,%rbx
81
+ je fire
82
+ movq 40(%r11),%r9
83
+ fire: jmp *%r12
data/ext/usdt/Makefile ADDED
@@ -0,0 +1,157 @@
1
+
2
+ SHELL = /bin/sh
3
+
4
+ #### Start of system configuration section. ####
5
+
6
+ srcdir = .
7
+ topdir = /Users/kevin/.rvm/rubies/ruby-1.8.7-p358/lib/ruby/1.8/i686-darwin11.3.0
8
+ hdrdir = $(topdir)
9
+ VPATH = $(srcdir):$(topdir):$(hdrdir)
10
+ prefix = $(DESTDIR)/Users/kevin/.rvm/rubies/ruby-1.8.7-p358
11
+ exec_prefix = $(prefix)
12
+ htmldir = $(docdir)
13
+ vendorarchdir = $(vendorlibdir)/$(sitearch)
14
+ sitedir = $(libdir)/ruby/site_ruby
15
+ pdfdir = $(docdir)
16
+ dvidir = $(docdir)
17
+ sharedstatedir = $(prefix)/com
18
+ vendordir = $(libdir)/ruby/vendor_ruby
19
+ psdir = $(docdir)
20
+ libexecdir = $(exec_prefix)/libexec
21
+ datarootdir = $(prefix)/share
22
+ bindir = $(exec_prefix)/bin
23
+ infodir = $(datarootdir)/info
24
+ sitearchdir = $(sitelibdir)/$(sitearch)
25
+ sysconfdir = $(prefix)/etc
26
+ archdir = $(rubylibdir)/$(arch)
27
+ sbindir = $(exec_prefix)/sbin
28
+ includedir = $(prefix)/include
29
+ mandir = $(datarootdir)/man
30
+ rubylibdir = $(libdir)/ruby/$(ruby_version)
31
+ localstatedir = $(prefix)/var
32
+ vendorlibdir = $(vendordir)/$(ruby_version)
33
+ sitelibdir = $(sitedir)/$(ruby_version)
34
+ docdir = $(datarootdir)/doc/$(PACKAGE)
35
+ datadir = $(datarootdir)
36
+ localedir = $(datarootdir)/locale
37
+ libdir = $(exec_prefix)/lib
38
+ oldincludedir = $(DESTDIR)/usr/include
39
+
40
+ CC = /usr/bin/gcc-4.2
41
+ LIBRUBY = $(LIBRUBY_SO)
42
+ LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
43
+ LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
44
+ LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
45
+
46
+ RUBY_EXTCONF_H =
47
+ CFLAGS = -fno-common -g -O2 -fno-common -pipe -fno-common $(cflags)
48
+ INCFLAGS = -I. -I. -I/Users/kevin/.rvm/rubies/ruby-1.8.7-p358/lib/ruby/1.8/i686-darwin11.3.0 -I.
49
+ DEFS =
50
+ CPPFLAGS = -DHAVE_USDT_H -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE
51
+ CXXFLAGS = $(CFLAGS)
52
+ ldflags = -L.
53
+ dldflags =
54
+ archflag =
55
+ DLDFLAGS = $(ldflags) $(dldflags) $(archflag)
56
+ LDSHARED = cc -dynamic -bundle -undefined suppress -flat_namespace
57
+ AR = ar
58
+ EXEEXT =
59
+
60
+ RUBY_INSTALL_NAME = ruby
61
+ RUBY_SO_NAME = ruby
62
+ arch = i686-darwin11.3.0
63
+ sitearch = i686-darwin11.3.0
64
+ ruby_version = 1.8
65
+ ruby = /Users/kevin/.rvm/rubies/ruby-1.8.7-p358/bin/ruby
66
+ RUBY = $(ruby)
67
+ RM = rm -f
68
+ MAKEDIRS = mkdir -p
69
+ INSTALL = /usr/bin/install -c
70
+ INSTALL_PROG = $(INSTALL) -m 0755
71
+ INSTALL_DATA = $(INSTALL) -m 644
72
+ COPY = cp
73
+
74
+ #### End of system configuration section. ####
75
+
76
+ preload =
77
+
78
+ libpath = . $(libdir)
79
+ LIBPATH = -L. -L$(libdir)
80
+ DEFFILE =
81
+
82
+ CLEANFILES = mkmf.log
83
+ DISTCLEANFILES =
84
+
85
+ extout =
86
+ extout_prefix =
87
+ target_prefix =
88
+ LOCAL_LIBS =
89
+ LIBS = $(LIBRUBYARG_SHARED) -lusdt -ldtrace -ldl -lobjc
90
+ SRCS = usdt.c
91
+ OBJS = usdt.o
92
+ TARGET = usdt
93
+ DLLIB = $(TARGET).bundle
94
+ EXTSTATIC =
95
+ STATIC_LIB =
96
+
97
+ BINDIR = $(bindir)
98
+ RUBYCOMMONDIR = $(sitedir)$(target_prefix)
99
+ RUBYLIBDIR = $(sitelibdir)$(target_prefix)
100
+ RUBYARCHDIR = $(sitearchdir)$(target_prefix)
101
+
102
+ TARGET_SO = $(DLLIB)
103
+ CLEANLIBS = $(TARGET).bundle $(TARGET).il? $(TARGET).tds $(TARGET).map
104
+ CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
105
+
106
+ all: $(DLLIB)
107
+ static: $(STATIC_LIB)
108
+
109
+ clean:
110
+ @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
111
+
112
+ distclean: clean
113
+ @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
114
+ @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
115
+
116
+ realclean: distclean
117
+ install: install-so install-rb
118
+
119
+ install-so: $(RUBYARCHDIR)
120
+ install-so: $(RUBYARCHDIR)/$(DLLIB)
121
+ $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
122
+ $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
123
+ install-rb: pre-install-rb install-rb-default
124
+ install-rb-default: pre-install-rb-default
125
+ pre-install-rb: Makefile
126
+ pre-install-rb-default: Makefile
127
+ $(RUBYARCHDIR):
128
+ $(MAKEDIRS) $@
129
+
130
+ site-install: site-install-so site-install-rb
131
+ site-install-so: install-so
132
+ site-install-rb: install-rb
133
+
134
+ .SUFFIXES: .c .m .cc .cxx .cpp .C .o
135
+
136
+ .cc.o:
137
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
138
+
139
+ .cxx.o:
140
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
141
+
142
+ .cpp.o:
143
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
144
+
145
+ .C.o:
146
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
147
+
148
+ .c.o:
149
+ $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $<
150
+
151
+ $(DLLIB): $(OBJS) Makefile
152
+ @-$(RM) $@
153
+ $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
154
+
155
+
156
+
157
+ $(OBJS): ruby.h defines.h
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleDevelopmentRegion</key>
6
+ <string>English</string>
7
+ <key>CFBundleIdentifier</key>
8
+ <string>com.apple.xcode.dsym.conftest</string>
9
+ <key>CFBundleInfoDictionaryVersion</key>
10
+ <string>6.0</string>
11
+ <key>CFBundlePackageType</key>
12
+ <string>dSYM</string>
13
+ <key>CFBundleSignature</key>
14
+ <string>????</string>
15
+ <key>CFBundleShortVersionString</key>
16
+ <string>1.0</string>
17
+ <key>CFBundleVersion</key>
18
+ <string>1</string>
19
+ </dict>
20
+ </plist>
@@ -0,0 +1,9 @@
1
+ require 'mkmf'
2
+
3
+ have_library("dtrace", "dtrace_open", "/usr/include/dtrace.h")
4
+ system("cd ../libusdt && make")
5
+ system("cp ../libusdt/usdt.h ../libusdt/*.a ./")
6
+ have_library('usdt')
7
+ have_header('usdt.h')
8
+
9
+ create_makefile('usdt')
data/ext/usdt/test.rb ADDED
@@ -0,0 +1,23 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/usdt'
2
+
3
+ provider = USDT::Provider.create :ruby, :test
4
+ puts provider
5
+ p = provider.probe("myfn", "probe",
6
+ :string, :string, :integer)
7
+
8
+ provider.enable
9
+
10
+ puts "run:\nsudo dtrace -n 'ruby*:test:myfn:probe { printf(\"%s %s %d\",
11
+ copyinstr(arg0),
12
+ copyinstr(arg1),
13
+ args[2])
14
+ }'"
15
+
16
+ while true
17
+ if p.enabled?
18
+ p.fire("one", "two", 3)
19
+ puts("Fired!")
20
+ end
21
+ sleep 0.5
22
+ end
23
+
data/ext/usdt/usdt.c ADDED
@@ -0,0 +1,141 @@
1
+ #include <ruby.h>
2
+ #include "usdt.h"
3
+
4
+ VALUE USDT;
5
+ VALUE USDT_Provider;
6
+ VALUE USDT_Probe;
7
+ VALUE USDT_Error;
8
+
9
+ static VALUE provider_create(VALUE self, VALUE name, VALUE mod);
10
+ static VALUE provider_probe(int argc, VALUE *argv, VALUE self);
11
+ static VALUE provider_enable(VALUE self);
12
+ static VALUE probe_enabled(VALUE self);
13
+ static VALUE probe_fire(int argc, VALUE *argv, VALUE self);
14
+
15
+ void Init_usdt() {
16
+ USDT = rb_define_module("USDT");
17
+
18
+ USDT_Error = rb_define_class_under(USDT, "Error", rb_eRuntimeError);
19
+
20
+ USDT_Provider = rb_define_class_under(USDT, "Provider", rb_cObject);
21
+ rb_define_singleton_method(USDT_Provider, "create", provider_create, 2);
22
+ rb_define_method(USDT_Provider, "probe", provider_probe, -1);
23
+ rb_define_method(USDT_Provider, "enable", provider_enable, 0);
24
+
25
+ USDT_Probe = rb_define_class_under(USDT, "Probe", rb_cObject);
26
+ rb_define_method(USDT_Probe, "enabled?", probe_enabled, 0);
27
+ rb_define_method(USDT_Probe, "fire", probe_fire, -1);
28
+ }
29
+
30
+ /**
31
+ * USDT::Provider.create :name, :modname
32
+ */
33
+ static VALUE provider_create(VALUE self, VALUE name, VALUE mod) {
34
+ Check_Type(name, T_SYMBOL);
35
+ Check_Type(mod, T_SYMBOL);
36
+
37
+ char *namestr = rb_id2name(rb_to_id(name));
38
+ char *modstr = rb_id2name(rb_to_id(mod));
39
+
40
+ usdt_provider_t* p = usdt_create_provider(namestr, modstr);
41
+
42
+ VALUE rbProvider = Data_Wrap_Struct(USDT_Provider, NULL, free, p);
43
+
44
+ if (rb_block_given_p()) {
45
+ rb_yield(rbProvider);
46
+ }
47
+
48
+ return rbProvider;
49
+ }
50
+
51
+ /**
52
+ * USDT::Provider#probe(func, name, pargs*)
53
+ */
54
+ static VALUE provider_probe(int argc, VALUE *argv, VALUE self) {
55
+ const char *func = RSTRING_PTR(argv[0]);
56
+ const char *name = RSTRING_PTR(argv[1]);
57
+ const char *types[6];
58
+ size_t i, pargc = 0;
59
+ size_t t_int = rb_intern("integer");
60
+ size_t t_str = rb_intern("string");
61
+
62
+ for (i = 0; i < 6; i++) {
63
+ if (i < argc - 2) {
64
+ Check_Type(argv[i+2], T_SYMBOL);
65
+ if (t_int == rb_to_id(argv[i+2])) {
66
+ types[i] = "int";
67
+ pargc++;
68
+ } else if (t_str == rb_to_id(argv[i+2])) {
69
+ types[i] = "char *";
70
+ pargc++;
71
+ } else {
72
+ types[i] = NULL;
73
+ }
74
+ } else {
75
+ types[i] = NULL;
76
+ }
77
+ }
78
+
79
+ usdt_provider_t *provider = DATA_PTR(self);
80
+
81
+ usdt_probedef_t **probe;
82
+ probe = ALLOC(usdt_probedef_t *);
83
+ *probe = usdt_create_probe(func, name, pargc, types);
84
+
85
+ usdt_provider_add_probe(provider, *probe);
86
+ VALUE rbProbe = Data_Wrap_Struct(USDT_Probe, NULL, free, probe);
87
+ return rbProbe;
88
+ }
89
+
90
+ /**
91
+ * USDT::Provider#enable
92
+ */
93
+ static VALUE provider_enable(VALUE self) {
94
+ usdt_provider_t *provider = DATA_PTR(self);
95
+ int status = usdt_provider_enable(provider);
96
+ if (status == 0) {
97
+ return Qtrue;
98
+ } else {
99
+ rb_raise(USDT_Error, "%s", usdt_errstr(provider));
100
+ }
101
+ }
102
+
103
+ /**
104
+ * USDT::Probe#enabled?
105
+ */
106
+ static VALUE probe_enabled(VALUE self) {
107
+ usdt_probedef_t **p = DATA_PTR(self);
108
+ usdt_probedef_t *pd = *p;
109
+
110
+ if (usdt_is_enabled(pd->probe) == 0) {
111
+ return Qfalse;
112
+ } else {
113
+ return Qtrue;
114
+ }
115
+ }
116
+
117
+ /**
118
+ * USDT::Probe#fire *args
119
+ */
120
+ static VALUE probe_fire(int argc, VALUE *argv, VALUE self) {
121
+ usdt_probedef_t **p = DATA_PTR(self);
122
+ usdt_probedef_t *probedef = *p;
123
+
124
+ void *pargs[6];
125
+ int i;
126
+
127
+ for (i = 0; i < probedef->argc; i++) {
128
+ if (probedef->types[i] == USDT_ARGTYPE_STRING) {
129
+ Check_Type(argv[i], T_STRING);
130
+ pargs[i] = (void *) RSTRING_PTR(argv[i]);
131
+ } else if (probedef->types[i] == USDT_ARGTYPE_INTEGER) {
132
+ Check_Type(argv[i], T_FIXNUM);
133
+ pargs[i] = (void *) FIX2INT(argv[i]);
134
+ } else {
135
+ pargs[i] = NULL;
136
+ }
137
+ }
138
+
139
+ usdt_fire_probe(probedef->probe, probedef->argc, pargs);
140
+ return Qtrue;
141
+ }
data/ext/usdt/usdt.h ADDED
@@ -0,0 +1,50 @@
1
+ #include <stdint.h>
2
+ #include <unistd.h>
3
+
4
+ typedef uint8_t usdt_argtype_t;
5
+ #define USDT_ARGTYPE_NONE 0
6
+ #define USDT_ARGTYPE_STRING 1
7
+ #define USDT_ARGTYPE_INTEGER 2
8
+
9
+ typedef enum usdt_error {
10
+ USDT_ERROR_MALLOC = 0,
11
+ USDT_ERROR_VALLOC,
12
+ USDT_ERROR_NOPROBES,
13
+ USDT_ERROR_LOADDOF
14
+ } usdt_error_t;
15
+
16
+ typedef struct usdt_probe {
17
+ int (*isenabled_addr)(void);
18
+ void *probe_addr;
19
+ } usdt_probe_t;
20
+
21
+ int usdt_is_enabled(usdt_probe_t *probe);
22
+ void usdt_fire_probe(usdt_probe_t *probe, size_t argc, void **argv);
23
+
24
+ typedef struct usdt_probedef {
25
+ const char *name;
26
+ const char *function;
27
+ size_t argc;
28
+ usdt_argtype_t types[6];
29
+ struct usdt_probe *probe;
30
+ struct usdt_probedef *next;
31
+ } usdt_probedef_t;
32
+
33
+ usdt_probedef_t *usdt_create_probe_varargs(const char *func, const char *name, ...);
34
+ usdt_probedef_t *usdt_create_probe(const char *func, const char *name,
35
+ size_t argc, const char **types);
36
+
37
+ typedef struct usdt_provider {
38
+ const char *name;
39
+ const char *module;
40
+ usdt_probedef_t *probedefs;
41
+ char *error;
42
+ } usdt_provider_t;
43
+
44
+ usdt_provider_t *usdt_create_provider(const char *name, const char *module);
45
+ void usdt_provider_add_probe(usdt_provider_t *provider, usdt_probedef_t *probedef);
46
+ int usdt_provider_enable(usdt_provider_t *provider);
47
+
48
+ void usdt_error(usdt_provider_t *provider, usdt_error_t error);
49
+ char *usdt_errstr(usdt_provider_t *provider);
50
+
@@ -0,0 +1,3 @@
1
+ module USDT
2
+ VERSION = '0.0.1'
3
+ end
data/lib/usdt.rb ADDED
@@ -0,0 +1,2 @@
1
+ require "usdt/version"
2
+ require 'usdt/usdt'
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-usdt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kevin Chan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-20 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description:
15
+ email:
16
+ - kevin@yinkei.com
17
+ executables: []
18
+ extensions:
19
+ - ext/usdt/extconf.rb
20
+ extra_rdoc_files: []
21
+ files:
22
+ - lib/usdt/version.rb
23
+ - lib/usdt.rb
24
+ - ext/libusdt/Makefile
25
+ - ext/libusdt/README
26
+ - ext/libusdt/test.pl
27
+ - ext/libusdt/test_usdt.c
28
+ - ext/libusdt/usdt.c
29
+ - ext/libusdt/usdt.h
30
+ - ext/libusdt/usdt_dof.c
31
+ - ext/libusdt/usdt_dof_file.c
32
+ - ext/libusdt/usdt_dof_sections.c
33
+ - ext/libusdt/usdt_internal.h
34
+ - ext/libusdt/usdt_probe.c
35
+ - ext/libusdt/usdt_tracepoints_i386.s
36
+ - ext/libusdt/usdt_tracepoints_x86_64.s
37
+ - ext/usdt/conftest.dSYM/Contents/Info.plist
38
+ - ext/usdt/conftest.dSYM/Contents/Resources/DWARF/conftest
39
+ - ext/usdt/extconf.rb
40
+ - ext/usdt/Makefile
41
+ - ext/usdt/test.rb
42
+ - ext/usdt/usdt.c
43
+ - ext/usdt/usdt.h
44
+ - README.md
45
+ - LICENSE.md
46
+ homepage: http://github.com/kevinykchan/ruby-usdt
47
+ licenses: []
48
+ post_install_message:
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ - ext
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 1.8.21
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: ruby bindings to libusdt
71
+ test_files: []