473ee328c5
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> |
||
---|---|---|
.github | ||
basictest | ||
benchmark | ||
bin | ||
bootstraptest | ||
ccan | ||
coroutine | ||
coverage | ||
cygwin | ||
defs | ||
doc | ||
enc | ||
ext | ||
gems | ||
include | ||
internal | ||
lib | ||
libexec | ||
man | ||
misc | ||
missing | ||
sample | ||
spec | ||
template | ||
test | ||
tool | ||
wasm | ||
win32 | ||
yjit | ||
.appveyor.yml | ||
.cirrus.yml | ||
.dir-locals.el | ||
.document | ||
.editorconfig | ||
.gdbinit | ||
.gitattributes | ||
.gitignore | ||
.rdoc_options | ||
.rspec_parallel | ||
.travis.yml | ||
aclocal.m4 | ||
addr2line.c | ||
addr2line.h | ||
array.c | ||
array.rb | ||
ast.c | ||
ast.rb | ||
autogen.sh | ||
bignum.c | ||
BSDL | ||
builtin.c | ||
builtin.h | ||
class.c | ||
common.mk | ||
compar.c | ||
compile.c | ||
complex.c | ||
configure.ac | ||
constant.h | ||
cont.c | ||
CONTRIBUTING.md | ||
COPYING | ||
COPYING.ja | ||
darray.h | ||
debug.c | ||
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 | ||
enumerator.c | ||
error.c | ||
eval.c | ||
eval_error.c | ||
eval_intern.h | ||
eval_jump.c | ||
file.c | ||
gc.c | ||
gc.h | ||
gc.rb | ||
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 | ||
io.rb | ||
io_buffer.c | ||
iseq.c | ||
iseq.h | ||
kernel.rb | ||
KNOWNBUGS.rb | ||
LEGAL | ||
lex.c.blt | ||
load.c | ||
loadpath.c | ||
localeinit.c | ||
main.c | ||
marshal.c | ||
marshal.rb | ||
math.c | ||
memory_view.c | ||
method.h | ||
mini_builtin.c | ||
miniinit.c | ||
mjit.c | ||
mjit.h | ||
mjit_compile.c | ||
mjit_worker.c | ||
NEWS.md | ||
nilclass.rb | ||
node.c | ||
node.h | ||
numeric.c | ||
numeric.rb | ||
object.c | ||
pack.c | ||
pack.rb | ||
parse.y | ||
prelude.rb | ||
probes.d | ||
probes_helper.h | ||
proc.c | ||
process.c | ||
ractor.c | ||
ractor.rb | ||
ractor_core.h | ||
random.c | ||
range.c | ||
rational.c | ||
re.c | ||
README.EXT | ||
README.EXT.ja | ||
README.ja.md | ||
README.md | ||
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 | ||
string.rb | ||
struct.c | ||
symbol.c | ||
symbol.h | ||
thread.c | ||
thread_none.c | ||
thread_none.h | ||
thread_pthread.c | ||
thread_pthread.h | ||
thread_sync.c | ||
thread_win32.c | ||
thread_win32.h | ||
time.c | ||
timev.h | ||
timev.rb | ||
trace_point.rb | ||
transcode.c | ||
transcode_data.h | ||
transient_heap.c | ||
transient_heap.h | ||
util.c | ||
variable.c | ||
variable.h | ||
version.c | ||
version.h | ||
vm.c | ||
vm_args.c | ||
vm_backtrace.c | ||
vm_callinfo.h | ||
vm_core.h | ||
vm_debug.h | ||
vm_dump.c | ||
vm_eval.c | ||
vm_exec.c | ||
vm_exec.h | ||
vm_insnhelper.c | ||
vm_insnhelper.h | ||
vm_method.c | ||
vm_opts.h | ||
vm_sync.c | ||
vm_sync.h | ||
vm_trace.c | ||
vsnprintf.c | ||
warning.rb | ||
yjit.c | ||
yjit.h | ||
yjit.rb |
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
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.