1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
The Ruby Programming Language [mirror]
Find a file
Eileen M. Uchitelle 473ee328c5
Add ability to trace exit locations in yjit (#5970)
When running with `--yjit-stats` turned on, yjit can inform the user
what the most common exits are. While this is useful information it
doesn't tell you the source location of the code that exited or what the
code that exited looks like. This change intends to fix that.

To use the feature, run yjit with the `--yjit-trace-exits` option,
which will record the backtrace for every exit that occurs. This functionality
requires the stats feature to be turned on. Calling `--yjit-trace-exits`
will automatically set the `--yjit-stats` option.

Users must call `RubyVM::YJIT.dump_exit_locations(filename)` which will
Marshal dump the contents of `RubyVM::YJIT.exit_locations` into a file
based on the passed filename.

*Example usage:*

Given the following script, we write to a file called
`concat_array.dump` the results of `RubyVM::YJIT.exit_locations`.

```ruby
def concat_array
  ["t", "r", *x = "u", "e"].join
end

1000.times do
  concat_array
end

RubyVM::YJIT.dump_exit_locations("concat_array.dump")
```

When we run the file with this branch and the appropriate flags the
stacktrace will be recorded. Note Stackprof needs to be installed or you
need to point to the library directly.

```
./ruby --yjit --yjit-call-threshold=1 --yjit-trace-exits -I/Users/eileencodes/open_source/stackprof/lib test.rb
```

We can then read the dump file with Stackprof:

```
./ruby -I/Users/eileencodes/open_source/stackprof/lib/ /Users/eileencodes/open_source/stackprof/bin/stackprof --text concat_array.dump
```

Results will look similar to the following:

```
==================================
  Mode: ()
  Samples: 1817 (0.00% miss rate)
  GC: 0 (0.00%)
==================================
     TOTAL    (pct)     SAMPLES    (pct)     FRAME
      1001  (55.1%)        1001  (55.1%)     concatarray
       335  (18.4%)         335  (18.4%)     invokeblock
       178   (9.8%)         178   (9.8%)     send
       140   (7.7%)         140   (7.7%)     opt_getinlinecache
       ...etc...
```

Simply inspecting the `concatarray` method will give `SOURCE
UNAVAILABLE` because the source is insns.def.

```
./ruby -I/Users/eileencodes/open_source/stackprof/lib/ /Users/eileencodes/open_source/stackprof/bin/stackprof --text concat_array.dump --method concatarray
```

Result:

```
concatarray (nonexistent.def:1)
  samples:  1001 self (55.1%)  /   1001 total (55.1%)
  callers:
    1000  (   99.9%)  Object#concat_array
       1  (    0.1%)  Gem.suffixes
  callees (0 total):
  code:
        SOURCE UNAVAILABLE
```

However if we go deeper to the callee we can see the exact
source of the `concatarray` exit.

```
./ruby -I/Users/eileencodes/open_source/stackprof/lib/ /Users/eileencodes/open_source/stackprof/bin/stackprof --text concat_array.dump --method Object#concat_array
```

```
Object#concat_array (/Users/eileencodes/open_source/rust_ruby/test.rb:1)
  samples:     0 self (0.0%)  /   1000 total (55.0%)
  callers:
    1000  (  100.0%)  block in <main>
  callees (1000 total):
    1000  (  100.0%)  concatarray
  code:
                                  |     1  | def concat_array
 1000   (55.0%)                   |     2  |   ["t", "r", *x = "u", "e"].join
                                  |     3  | end
```

The `--walk` option is recommended for this feature as it make it
easier to traverse the tree of exits.

*Goals of this feature:*

This feature is meant to give more information when working on YJIT.
The idea is that if we know what code is exiting we can decide what
areas to prioritize when fixing exits. In some cases this means adding
prioritizing avoiding certain exits in yjit. In more complex cases it
might mean changing the Ruby code to be more performant when run with
yjit. Ultimately the more information we have about what code is exiting
AND why, the better we can make yjit.

*Known limitations:*

* Due to tracing exits, running this on large codebases like Rails
can be quite slow.
* On complex methods it can still be difficult to pinpoint the exact cause of
an exit.
* Stackprof is a requirement to to view the backtrace information from
the dump file.

Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>

Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>
2022-06-09 12:59:39 -04:00
.github .github/workflows/compilers.yml: annocheck: Fix a linker flag to pass MJIT tests. 2022-06-07 00:25:19 +02:00
basictest
benchmark Update the help message on /benchmark 2022-06-07 21:30:28 -07:00
bin
bootstraptest Add special-case code for the String unary plus operator (#5982) 2022-06-07 11:20:57 -04:00
ccan
coroutine Add support for address sanitizer for amd64 and arm64. 2022-05-25 15:24:24 +12:00
coverage
cygwin
defs Split YJIT rules for CODEOWNERS 2022-06-02 10:12:34 +09:00
doc doc/case_mapping.rdoc: Fix references for case mapping 2022-06-09 18:21:39 +09:00
enc
ext [Feature #18339] GVL Instrumentation API 2022-06-03 15:13:33 +02:00
gems
include [Feature #18339] GVL Instrumentation API 2022-06-03 15:13:33 +02:00
internal Remove duplicated prototype in header file 2022-06-07 14:15:59 -04:00
lib [ruby/timeout] Keep a private reference to Process.clock_gettime 2022-06-09 18:58:49 +09:00
libexec
man
misc Add more information to lldb dump_page helper 2022-05-27 13:45:33 -07:00
missing
sample
spec [rubygems/rubygems] Relax performance spec limit 2022-06-07 21:04:53 +09:00
template Add yjit.o to DTRACE_DEPENDENT_OBJS 2022-05-30 18:30:57 -04:00
test Add ability to trace exit locations in yjit (#5970) 2022-06-09 12:59:39 -04:00
tool Hack to avoid leak checker 2022-05-25 18:48:01 +09:00
wasm
win32
yjit Add ability to trace exit locations in yjit (#5970) 2022-06-09 12:59:39 -04:00
.appveyor.yml
.cirrus.yml
.dir-locals.el
.document
.editorconfig
.gdbinit
.gitattributes
.gitignore
.rdoc_options
.rspec_parallel
.travis.yml
aclocal.m4
addr2line.c Skip NULL values from dladdr(3) 2022-06-09 20:43:41 +09:00
addr2line.h
array.c
array.rb
ast.c
ast.rb
autogen.sh
bignum.c Fix the condition when a new buffer is needed without GMP 2022-06-02 10:29:53 +09:00
BSDL
builtin.c
builtin.h Typedef built-in function types 2022-06-02 16:05:35 +09:00
class.c Add Module#undefined_instance_methods 2022-06-06 09:57:32 -07:00
common.mk Update the help message on /benchmark 2022-06-07 21:30:28 -07:00
compar.c
compile.c
complex.c
configure.ac Remove useless assignment always overridden 2022-06-06 11:30:26 +09:00
constant.h
cont.c Remove unnecessary ignore warnings. 2022-05-26 16:51:53 +12:00
CONTRIBUTING.md
COPYING
COPYING.ja
darray.h
debug.c func: and file: prefix for RUBY_DEBUG_LOG_FILTER 2022-06-09 01:51:19 +09:00
debug_counter.c
debug_counter.h
dir.c
dir.rb
dln.c
dln.h
dln_find.c
dmydln.c
dmyenc.c
dmyext.c
encindex.h
encoding.c
enum.c Revert flawed doc for slice_after, slice_when, and chunk_while (#5952) 2022-05-28 14:20:00 -05:00
enumerator.c
error.c [DOC] RDoc now accepts other than magic numbers at rb_attr 2022-06-08 11:55:21 +09:00
eval.c Remove unnecessary module flag, add module assertions to other module flags 2022-05-23 11:04:34 -07:00
eval_error.c
eval_intern.h
eval_jump.c
file.c
gc.c Fix major GC thrashing 2022-06-08 12:09:19 -04:00
gc.h
gc.rb Move GC.verify_compaction_references [Bug #18779] 2022-06-02 15:32:00 +09:00
gem_prelude.rb
golf_prelude.rb
goruby.c
GPL
hash.c
hrtime.h
id_table.c
id_table.h
inits.c
insns.def
internal.h
io.c Stop ignoring 4th positional argument to IO.#{foreach,readlines} 2022-06-09 08:22:06 -07:00
io.rb
io_buffer.c
iseq.c
iseq.h
kernel.rb
KNOWNBUGS.rb
LEGAL
lex.c.blt
load.c [DOC] Mention the case to autoload already defined constant 2022-06-03 14:10:30 +09:00
loadpath.c
localeinit.c
main.c [WASM] System initialization has no stack rewinding code to Asyncify 2022-05-24 12:17:19 +09:00
marshal.c
marshal.rb
math.c
memory_view.c Only check class ancestors for ivar in memory_view 2022-05-27 13:38:40 -07:00
method.h
mini_builtin.c
miniinit.c
mjit.c
mjit.h
mjit_compile.c Fix MJIT's ISEQ_BODY macro usage at 5f10bd634f 2022-06-08 22:39:18 -07:00
mjit_worker.c MJIT: Directly compile .c to .so (#5987) 2022-06-08 10:49:00 -07:00
NEWS.md Add Module#undefined_instance_methods 2022-06-06 09:57:32 -07:00
nilclass.rb
node.c
node.h
numeric.c [DOC] Fix documentation of Numeric#div: Complex does not have #div 2022-06-03 14:35:47 +09:00
numeric.rb
object.c Add Module#undefined_instance_methods 2022-06-06 09:57:32 -07:00
pack.c
pack.rb
parse.y Ignore invalid escapes in regexp comments 2022-06-06 13:50:03 -07:00
prelude.rb
probes.d
probes_helper.h
proc.c
process.c
ractor.c
ractor.rb
ractor_core.h
random.c
range.c Fix Range#cover? returning true for beginless ranges of different types 2022-06-06 09:59:22 -07:00
rational.c
re.c Ignore invalid escapes in regexp comments 2022-06-06 13:50:03 -07:00
README.EXT
README.EXT.ja
README.ja.md
README.md Update "Reporting Issues" link in the README 2022-06-08 17:49:56 +09:00
regcomp.c
regenc.c
regenc.h
regerror.c
regexec.c
regint.h
regparse.c
regparse.h
regsyntax.c
ruby-runner.c
ruby.c
ruby_assert.h
ruby_atomic.h
rubystub.c
scheduler.c
signal.c
siphash.c
siphash.h
sparc.c
sprintf.c
st.c
strftime.c
string.c Revert "error.c: Let Exception#inspect inspect its message" 2022-06-07 11:52:44 +09:00
string.rb
struct.c Don't attempt to read ivars on T_ICLASS in struct (#5664) 2022-05-26 11:54:15 -07:00
symbol.c
symbol.h
thread.c use RUBY_DEBUG_LOG instead of thread_debug 2022-05-24 10:06:51 +09:00
thread_none.c remove DEBUG_OUT() macro 2022-05-24 16:28:07 +09:00
thread_none.h
thread_pthread.c thread_pthread.c: trigger THREAD_EVENT_READY when going throuhg the fast path. 2022-06-07 18:15:55 +02:00
thread_pthread.h altstack is native thread's attr 2022-05-24 17:50:49 +09:00
thread_sync.c
thread_win32.c [Feature #18339] GVL Instrumentation API 2022-06-03 15:13:33 +02:00
thread_win32.h native_tls_get()' should not check results 2022-05-24 10:06:51 +09:00
time.c Using TZMODE_SET_LOCALTIME macro 2022-05-26 19:55:05 +09:00
timev.h
timev.rb
trace_point.rb
transcode.c
transcode_data.h
transient_heap.c
transient_heap.h
util.c
variable.c Fix Module#const_source_location for autoload constants with direct requires 2022-06-06 11:12:55 -07:00
variable.h
version.c
version.h * 2022-06-10 [ci skip] 2022-06-10 00:22:27 +09:00
vm.c remove NON_SCALAR_THREAD_ID support 2022-05-24 10:06:51 +09:00
vm_args.c
vm_backtrace.c
vm_callinfo.h
vm_core.h altstack is native thread's attr 2022-05-24 17:50:49 +09:00
vm_debug.h Fix compile error 2022-06-09 09:35:08 +09:00
vm_dump.c Prevent printing crash report in a loop 2022-06-03 13:50:32 -04:00
vm_eval.c
vm_exec.c
vm_exec.h
vm_insnhelper.c Fix use-after-free with interacting TracePoints 2022-05-30 13:54:22 -04:00
vm_insnhelper.h
vm_method.c Remove unnecessary module flag, add module assertions to other module flags 2022-05-23 11:04:34 -07:00
vm_opts.h
vm_sync.c
vm_sync.h
vm_trace.c
vsnprintf.c
warning.rb
yjit.c Add ability to trace exit locations in yjit (#5970) 2022-06-09 12:59:39 -04:00
yjit.h
yjit.rb Add ability to trace exit locations in yjit (#5970) 2022-06-09 12:59:39 -04:00

Actions Status: MinGW Actions Status: MJIT Actions Status: Ubuntu Actions Status: Windows AppVeyor status Travis Status Cirrus Status

What is Ruby?

Ruby is an interpreted object-oriented programming language often used for web development. It also offers many scripting features to process plain text and serialized files, or manage system tasks. It is simple, straightforward, and extensible.

Features of Ruby

  • Simple Syntax
  • Normal Object-oriented Features (e.g. class, method calls)
  • Advanced Object-oriented Features (e.g. mix-in, singleton-method)
  • Operator Overloading
  • Exception Handling
  • Iterators and Closures
  • Garbage Collection
  • Dynamic Loading of Object Files (on some architectures)
  • Highly Portable (works on many Unix-like/POSIX compatible platforms as well as Windows, macOS, etc.) cf. https://github.com/ruby/ruby/blob/master/doc/maintainers.rdoc#label-Platform+Maintainers

How to get Ruby with Git

For a complete list of ways to install Ruby, including using third-party tools like rvm, see:

https://www.ruby-lang.org/en/downloads/

The mirror of the Ruby source tree can be checked out with the following command:

$ git clone https://github.com/ruby/ruby.git

There are some other branches under development. Try the following command to see the list of branches:

$ git ls-remote https://github.com/ruby/ruby.git

You may also want to use https://git.ruby-lang.org/ruby.git (actual master of Ruby source) if you are a committer.

Ruby home page

https://www.ruby-lang.org/

Documentation

Mailing list

There is a mailing list to discuss Ruby. To subscribe to this list, please send the following phrase:

subscribe

in the mail body (not subject) to the address ruby-talk-request@ruby-lang.org.

Copying

See the file COPYING.

Feedback

Questions about the Ruby language can be asked on the Ruby-Talk mailing list or on websites like https://stackoverflow.com.

Bugs should be reported at https://bugs.ruby-lang.org. Read "Reporting Issues" for more information.

Contributing

See "Contributing to Ruby", which includes setup and build instructions.

The Author

Ruby was originally designed and developed by Yukihiro Matsumoto (Matz) in 1995.

matz@ruby-lang.org