debase 0.2.2.beta8 → 0.2.2.beta9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +12 -0
- data/debase.gemspec +1 -1
- data/ext/attach/attach.c +51 -0
- data/ext/attach/attach.h +10 -0
- data/ext/attach/extconf.rb +54 -0
- data/ext/breakpoint.c +7 -1
- data/ext/context.c +7 -0
- data/ext/debase_internals.c +36 -13
- data/ext/debase_internals.h +3 -0
- data/lib/debase/version.rb +1 -1
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72f6bca149dbf44230032e0bc5232ed4dfbf1790
|
4
|
+
data.tar.gz: 1e1d31d2b83bcbd464ea32d0ad46b1f0f5c276d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef7fbb2819851e3fc04bda8532eb07a2da3c8be2c206dfdd0d8c056f4e19e376a48842b3f35ad350b2ffedc0e9aec4ec7b621bebd0a612cd830eedda45cb2f48
|
7
|
+
data.tar.gz: 7ca7fe17d565d711e67b6754fc04b04174bf8bad8a86fd4a0ed9d20905c42d4655eee94d8a1893674ac8713c4f6e3deebe381e8d135be6113c6d3f3978f46d74
|
data/Rakefile
CHANGED
@@ -13,6 +13,14 @@ task :clean do
|
|
13
13
|
derived_files = Dir.glob(".o") + Dir.glob("*.so") + Dir.glob("*.bundle")
|
14
14
|
rm derived_files unless derived_files.empty?
|
15
15
|
end
|
16
|
+
cd "ext/attach" do
|
17
|
+
if File.exists?("Makefile")
|
18
|
+
sh "make clean"
|
19
|
+
rm "Makefile"
|
20
|
+
end
|
21
|
+
derived_files = Dir.glob(".o") + Dir.glob("*.so") + Dir.glob("*.bundle")
|
22
|
+
rm derived_files unless derived_files.empty?
|
23
|
+
end
|
16
24
|
if File.exists?('pkg')
|
17
25
|
cd 'pkg' do
|
18
26
|
derived_files = Dir.glob('*.gem')
|
@@ -27,6 +35,10 @@ task :lib => :clean do
|
|
27
35
|
system("#{Gem.ruby} extconf.rb && make")
|
28
36
|
exit $?.to_i if $?.to_i != 0
|
29
37
|
end
|
38
|
+
Dir.chdir("ext/attach") do
|
39
|
+
system("#{Gem.ruby} extconf.rb && make")
|
40
|
+
exit $?.to_i if $?.to_i != 0
|
41
|
+
end
|
30
42
|
end
|
31
43
|
|
32
44
|
desc "Test debase."
|
data/debase.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
25
25
|
s.require_paths = ["lib"]
|
26
26
|
|
27
|
-
s.extensions = ["ext/extconf.rb"]
|
27
|
+
s.extensions = ["ext/extconf.rb", "ext/attach/extconf.rb"]
|
28
28
|
|
29
29
|
s.add_dependency "debase-ruby_core_source"
|
30
30
|
s.add_development_dependency "test-unit"
|
data/ext/attach/attach.c
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
#include "attach.h"
|
2
|
+
|
3
|
+
/*
|
4
|
+
We need to prevent compiler from optimizing this function calls. For more details
|
5
|
+
see "noinline" section here: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
|
6
|
+
*/
|
7
|
+
static void
|
8
|
+
__attribute__ ((noinline))
|
9
|
+
__func_to_set_breakpoint_at()
|
10
|
+
{
|
11
|
+
asm("");
|
12
|
+
}
|
13
|
+
|
14
|
+
static void
|
15
|
+
__catch_line_event(rb_event_flag_t evflag, VALUE data, VALUE self, ID mid, VALUE klass)
|
16
|
+
{
|
17
|
+
(void)sizeof(evflag);
|
18
|
+
(void)sizeof(self);
|
19
|
+
(void)sizeof(mid);
|
20
|
+
(void)sizeof(klass);
|
21
|
+
|
22
|
+
rb_remove_event_hook(__catch_line_event);
|
23
|
+
if (rb_during_gc())
|
24
|
+
return;
|
25
|
+
__func_to_set_breakpoint_at();
|
26
|
+
}
|
27
|
+
|
28
|
+
int
|
29
|
+
debase_start_attach()
|
30
|
+
{
|
31
|
+
if (rb_during_gc())
|
32
|
+
return 1;
|
33
|
+
rb_add_event_hook(__catch_line_event, RUBY_EVENT_LINE, (VALUE) NULL);
|
34
|
+
return 0;
|
35
|
+
}
|
36
|
+
|
37
|
+
void
|
38
|
+
debase_rb_eval(const char *string_to_eval)
|
39
|
+
{
|
40
|
+
rb_eval_string_protect(string_to_eval, NULL);
|
41
|
+
}
|
42
|
+
|
43
|
+
void
|
44
|
+
Init_attach()
|
45
|
+
{
|
46
|
+
/*
|
47
|
+
The only purpose of this library is to be dlopen'ed inside
|
48
|
+
gdb/lldb. So no initialization here, you should directly
|
49
|
+
call functions above.
|
50
|
+
*/
|
51
|
+
}
|
data/ext/attach/attach.h
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
if defined?(RUBY_ENGINE) && 'rbx' == RUBY_ENGINE
|
2
|
+
# create dummy Makefile to indicate success
|
3
|
+
f = File.open(File.join(File.dirname(__FILE__), "Makefile"), "w")
|
4
|
+
f.write("all:\n\techo all\ninstall:\n\techo installed\n")
|
5
|
+
f.close
|
6
|
+
return
|
7
|
+
end
|
8
|
+
|
9
|
+
# autodetect ruby headers
|
10
|
+
unless ARGV.any? {|arg| arg.include?('--with-ruby-include') }
|
11
|
+
require 'rbconfig'
|
12
|
+
bindir = RbConfig::CONFIG['bindir']
|
13
|
+
if bindir =~ %r{(^.*/\.rbenv/versions)/([^/]+)/bin$}
|
14
|
+
ruby_include = "#{$1}/#{$2}/include/ruby-1.9.1/ruby-#{$2}"
|
15
|
+
ruby_include = "#{ENV['RBENV_ROOT']}/sources/#{$2}/ruby-#{$2}" unless File.exist?(ruby_include)
|
16
|
+
ARGV << "--with-ruby-include=#{ruby_include}"
|
17
|
+
elsif bindir =~ %r{(^.*/\.rvm/rubies)/([^/]+)/bin$}
|
18
|
+
ruby_include = "#{$1}/#{$2}/include/ruby-1.9.1/#{$2}"
|
19
|
+
ruby_include = "#{ENV['rvm_path']}/src/#{$2}" unless File.exist?(ruby_include)
|
20
|
+
ARGV << "--with-ruby-include=#{ruby_include}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
require "mkmf"
|
25
|
+
|
26
|
+
RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC']
|
27
|
+
|
28
|
+
require "debase/ruby_core_source"
|
29
|
+
|
30
|
+
hdrs = proc {
|
31
|
+
have_header("vm_core.h")
|
32
|
+
}
|
33
|
+
|
34
|
+
# Allow use customization of compile options. For example, the
|
35
|
+
# following lines could be put in config_options to to turn off
|
36
|
+
# optimization:
|
37
|
+
# $CFLAGS='-fPIC -fno-strict-aliasing -g3 -ggdb -O2 -fPIC'
|
38
|
+
config_file = File.join(File.dirname(__FILE__), 'config_options.rb')
|
39
|
+
load config_file if File.exist?(config_file)
|
40
|
+
|
41
|
+
if ENV['debase_debug']
|
42
|
+
$CFLAGS+=' -Wall -Werror'
|
43
|
+
$CFLAGS+=' -g3'
|
44
|
+
end
|
45
|
+
|
46
|
+
dir_config("ruby")
|
47
|
+
if !Debase::RubyCoreSource.create_makefile_with_core(hdrs, "attach")
|
48
|
+
STDERR.print("Makefile creation failed\n")
|
49
|
+
STDERR.print("*************************************************************\n\n")
|
50
|
+
STDERR.print(" NOTE: If your headers were not found, try passing\n")
|
51
|
+
STDERR.print(" --with-ruby-include=PATH_TO_HEADERS \n\n")
|
52
|
+
STDERR.print("*************************************************************\n\n")
|
53
|
+
exit(1)
|
54
|
+
end
|
data/ext/breakpoint.c
CHANGED
@@ -219,9 +219,15 @@ breakpoint_find(VALUE breakpoints, VALUE source, VALUE pos)
|
|
219
219
|
}
|
220
220
|
|
221
221
|
extern void
|
222
|
-
|
222
|
+
breakpoint_init_variables()
|
223
223
|
{
|
224
224
|
breakpoint_max = 0;
|
225
|
+
}
|
226
|
+
|
227
|
+
extern void
|
228
|
+
Init_breakpoint(VALUE mDebase)
|
229
|
+
{
|
230
|
+
breakpoint_init_variables();
|
225
231
|
cBreakpoint = rb_define_class_under(mDebase, "Breakpoint", rb_cObject);
|
226
232
|
rb_define_singleton_method(cBreakpoint, "find", Breakpoint_find, 3);
|
227
233
|
rb_define_singleton_method(cBreakpoint, "remove", Breakpoint_remove, 2);
|
data/ext/context.c
CHANGED
@@ -345,6 +345,12 @@ Context_stop_frame(VALUE self, VALUE frame)
|
|
345
345
|
return frame;
|
346
346
|
}
|
347
347
|
|
348
|
+
extern void
|
349
|
+
context_init_variables()
|
350
|
+
{
|
351
|
+
thnum_current = 0;
|
352
|
+
}
|
353
|
+
|
348
354
|
/*
|
349
355
|
* Document-class: Context
|
350
356
|
*
|
@@ -373,6 +379,7 @@ Init_context(VALUE mDebase)
|
|
373
379
|
rb_define_method(cContext, "pause", Context_pause, 0);
|
374
380
|
|
375
381
|
idAlive = rb_intern("alive?");
|
382
|
+
context_init_variables();
|
376
383
|
|
377
384
|
return cContext;
|
378
385
|
// rb_define_method(cContext, "suspend", context_suspend, 0);
|
data/ext/debase_internals.c
CHANGED
@@ -24,6 +24,8 @@ static VALUE idAtCatchpoint;
|
|
24
24
|
static VALUE idFileFilter;
|
25
25
|
static VALUE idAccept;
|
26
26
|
|
27
|
+
static int started = 0;
|
28
|
+
|
27
29
|
static void
|
28
30
|
print_debug(const char *message, ...)
|
29
31
|
{
|
@@ -472,7 +474,9 @@ process_raise_event(VALUE trace_point, void *data)
|
|
472
474
|
static VALUE
|
473
475
|
Debase_setup_tracepoints(VALUE self)
|
474
476
|
{
|
475
|
-
if (
|
477
|
+
if (started) return Qnil;
|
478
|
+
started = 1;
|
479
|
+
|
476
480
|
contexts = rb_hash_new();
|
477
481
|
breakpoints = rb_ary_new();
|
478
482
|
catchpoints = rb_hash_new();
|
@@ -496,19 +500,13 @@ Debase_setup_tracepoints(VALUE self)
|
|
496
500
|
|
497
501
|
static VALUE
|
498
502
|
Debase_remove_tracepoints(VALUE self)
|
499
|
-
{
|
500
|
-
|
501
|
-
breakpoints = Qnil;
|
502
|
-
catchpoints = Qnil;
|
503
|
+
{
|
504
|
+
started = 0;
|
503
505
|
|
504
506
|
if (tpLine != Qnil) rb_tracepoint_disable(tpLine);
|
505
|
-
tpLine = Qnil;
|
506
507
|
if (tpReturn != Qnil) rb_tracepoint_disable(tpReturn);
|
507
|
-
tpReturn = Qnil;
|
508
508
|
if (tpCall != Qnil) rb_tracepoint_disable(tpCall);
|
509
|
-
tpCall = Qnil;
|
510
509
|
if (tpRaise != Qnil) rb_tracepoint_disable(tpRaise);
|
511
|
-
tpRaise = Qnil;
|
512
510
|
|
513
511
|
return Qnil;
|
514
512
|
}
|
@@ -530,6 +528,14 @@ debase_prepare_context(VALUE self, VALUE file, VALUE stop)
|
|
530
528
|
return self;
|
531
529
|
}
|
532
530
|
|
531
|
+
static VALUE
|
532
|
+
Debase_prepare_context(VALUE self)
|
533
|
+
{
|
534
|
+
Debase_current_context(self);
|
535
|
+
|
536
|
+
return self;
|
537
|
+
}
|
538
|
+
|
533
539
|
static VALUE
|
534
540
|
Debase_debug_load(int argc, VALUE *argv, VALUE self)
|
535
541
|
{
|
@@ -589,7 +595,7 @@ Debase_catchpoints(VALUE self)
|
|
589
595
|
static VALUE
|
590
596
|
Debase_started(VALUE self)
|
591
597
|
{
|
592
|
-
return
|
598
|
+
return started ? Qtrue : Qfalse;
|
593
599
|
}
|
594
600
|
|
595
601
|
/*
|
@@ -630,6 +636,23 @@ Debase_enable_file_filtering(VALUE self, VALUE value)
|
|
630
636
|
return value;
|
631
637
|
}
|
632
638
|
|
639
|
+
static VALUE
|
640
|
+
Debase_init_variables()
|
641
|
+
{
|
642
|
+
started = 0;
|
643
|
+
verbose = Qfalse;
|
644
|
+
locker = Qnil;
|
645
|
+
file_filter_enabled = Qfalse;
|
646
|
+
contexts = Qnil;
|
647
|
+
catchpoints = Qnil;
|
648
|
+
breakpoints = Qnil;
|
649
|
+
|
650
|
+
context_init_variables();
|
651
|
+
breakpoint_init_variables();
|
652
|
+
|
653
|
+
return Qtrue;
|
654
|
+
}
|
655
|
+
|
633
656
|
/*
|
634
657
|
* Document-class: Debase
|
635
658
|
*
|
@@ -654,6 +677,8 @@ Init_debase_internals()
|
|
654
677
|
rb_define_module_function(mDebase, "verbose=", Debase_set_verbose, 1);
|
655
678
|
rb_define_module_function(mDebase, "enable_file_filtering", Debase_enable_file_filtering, 1);
|
656
679
|
rb_define_module_function(mDebase, "enable_trace_points", Debase_enable_trace_points, 0);
|
680
|
+
rb_define_module_function(mDebase, "prepare_context", Debase_prepare_context, 0);
|
681
|
+
rb_define_module_function(mDebase, "init_variables", Debase_init_variables, 0);
|
657
682
|
|
658
683
|
idAlive = rb_intern("alive?");
|
659
684
|
idAtLine = rb_intern("at_line");
|
@@ -665,9 +690,7 @@ Init_debase_internals()
|
|
665
690
|
cContext = Init_context(mDebase);
|
666
691
|
Init_breakpoint(mDebase);
|
667
692
|
cDebugThread = rb_define_class_under(mDebase, "DebugThread", rb_cThread);
|
668
|
-
|
669
|
-
catchpoints = Qnil;
|
670
|
-
breakpoints = Qnil;
|
693
|
+
Debase_init_variables();
|
671
694
|
|
672
695
|
rb_global_variable(&locker);
|
673
696
|
rb_global_variable(&breakpoints);
|
data/ext/debase_internals.h
CHANGED
@@ -105,4 +105,7 @@ typedef struct
|
|
105
105
|
extern VALUE catchpoint_hit_count(VALUE catchpoints, VALUE exception, VALUE *exception_name);
|
106
106
|
extern VALUE breakpoint_find(VALUE breakpoints, VALUE source, VALUE pos);
|
107
107
|
extern void Init_breakpoint(VALUE mDebase);
|
108
|
+
|
109
|
+
extern void breakpoint_init_variables();
|
110
|
+
extern void context_init_variables();
|
108
111
|
#endif
|
data/lib/debase/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: debase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.2.
|
4
|
+
version: 0.2.2.beta9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dennis Ushakov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: debase-ruby_core_source
|
@@ -62,6 +62,7 @@ email:
|
|
62
62
|
executables: []
|
63
63
|
extensions:
|
64
64
|
- ext/extconf.rb
|
65
|
+
- ext/attach/extconf.rb
|
65
66
|
extra_rdoc_files: []
|
66
67
|
files:
|
67
68
|
- ".gitignore"
|
@@ -72,6 +73,9 @@ files:
|
|
72
73
|
- README.md
|
73
74
|
- Rakefile
|
74
75
|
- debase.gemspec
|
76
|
+
- ext/attach/attach.c
|
77
|
+
- ext/attach/attach.h
|
78
|
+
- ext/attach/extconf.rb
|
75
79
|
- ext/breakpoint.c
|
76
80
|
- ext/context.c
|
77
81
|
- ext/debase_internals.c
|
@@ -131,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
131
135
|
version: 1.3.1
|
132
136
|
requirements: []
|
133
137
|
rubyforge_project: debase
|
134
|
-
rubygems_version: 2.
|
138
|
+
rubygems_version: 2.4.8
|
135
139
|
signing_key:
|
136
140
|
specification_version: 4
|
137
141
|
summary: debase is a fast implementation of the standard Ruby debugger debug.rb for
|
@@ -161,3 +165,4 @@ test_files:
|
|
161
165
|
- test/test_catchpoint.rb
|
162
166
|
- test/test_load.rb
|
163
167
|
- test/test_reload_bug.rb
|
168
|
+
has_rdoc:
|