Feature #7434

Allow caller_locations and backtrace_locations to receive negative params

Added by Sam Saffron over 1 year ago. Updated over 1 year ago.

[ruby-core:50092]
Status:Assigned
Priority:Normal
Assignee:Koichi Sasada
Category:core
Target version:next minor

Description

Further to http://bugs.ruby-lang.org/issues/7051

It would be nice if callerlocations and backtracelocations has some parity with range apis.

pry(main)> [1,2,3][0..-2]
=> [1, 2]

Similarly:

caller_locations(0,-2) # should strip the bottom frame

This is actually quite important for diagnostics of Rails and other frameworks where the app code starts at a very deep frame.

At the moment you are forced to materialize all frames just to discard.

Associated revisions

Revision 37957
Added by Koichi Sasada over 1 year ago

  • vmbacktrace.c (vmbacktracetoary): support range argument like Array#[]. [ruby-trunk - Feature #7434] Test and document is not available. Please help us.

Revision 38664
Added by Zachary Scott over 1 year ago

  • test/ruby/test_backtrace.rb: Add test for r37957 [Feature #7434]

History

#1 Updated by Sam Saffron over 1 year ago

ouch, this was meant to be pointed at 2.0 can't figure out how to change

#2 Updated by Zachary Scott over 1 year ago

  • Category set to core
  • Status changed from Open to Assigned
  • Assignee set to Koichi Sasada
  • Target version set to 2.0.0

#3 Updated by Zachary Scott over 1 year ago

  • Target version changed from 2.0.0 to next minor

#4 Updated by Koichi Sasada over 1 year ago

(2012/11/26 6:59), sam.saffron (Sam Saffron) wrote:

caller_locations(0,-2) # should strip the bottom frame

2nd parmeter specify `how many frames'.
I feel 1st parameter is nice to accept negative index.

I don't have positive and negative one.

Could you show the concrete example and performance issue?

--
// SASADA Koichi at atdot dot net

#5 Updated by Sam Saffron over 1 year ago

This is a "typical" caller trace for a rails app:

app/controllers/listcontroller.rb:8:in block (2 levels) in <class:ListController>'
actionpack (3.2.9) lib/action_controller/metal/implicit_render.rb:4:in
send
action'
actionpack (3.2.9) lib/abstractcontroller/base.rb:167:in process_action'
actionpack (3.2.9) lib/action_controller/metal/rendering.rb:10:in
process
action'
actionpack (3.2.9) lib/abstractcontroller/callbacks.rb:18:in block in process_action'
activesupport (3.2.9) lib/active_support/callbacks.rb:447:in
run315638444processaction306812856callbacks'
activesupport (3.2.9) lib/active
support/callbacks.rb:405:in __run_callback'
activesupport (3.2.9) lib/active_support/callbacks.rb:385:in
runprocessactioncallbacks'
activesupport (3.2.9) lib/activesupport/callbacks.rb:81:in run_callbacks'
actionpack (3.2.9) lib/abstract_controller/callbacks.rb:17:in
process
action'
actionpack (3.2.9) lib/actioncontroller/metal/rescue.rb:29:in process_action'
actionpack (3.2.9) lib/action_controller/metal/instrumentation.rb:30:in
block in process
action'
activesupport (3.2.9) lib/activesupport/notifications.rb:123:in block in instrument'
activesupport (3.2.9) lib/active_support/notifications/instrumenter.rb:20:in
instrument'
activesupport (3.2.9) lib/active
support/notifications.rb:123:in instrument'
actionpack (3.2.9) lib/action_controller/metal/instrumentation.rb:29:in
processaction'
actionpack (3.2.9) lib/action
controller/metal/paramswrapper.rb:207:in process_action'
activerecord (3.2.9) lib/active_record/railties/controller_runtime.rb:18:in
process
action'
actionpack (3.2.9) lib/abstractcontroller/base.rb:121:in process'
actionpack (3.2.9) lib/abstract_controller/rendering.rb:45:in
process'
/home/sam/.rvm/gems/ruby-1.9.3-p194-perf/bundler/gems/MiniProfiler-cf359967ec7b/Ruby/lib/mini
profiler/profilingmethods.rb:90:in block in profile_method'
actionpack (3.2.9) lib/action_controller/metal.rb:203:in
dispatch'
actionpack (3.2.9) lib/action
controller/metal/rackdelegation.rb:14:in dispatch'
actionpack (3.2.9) lib/action_controller/metal.rb:246:in
block in action'
actionpack (3.2.9) lib/action
dispatch/routing/routeset.rb:73:in call'
actionpack (3.2.9) lib/action_dispatch/routing/route_set.rb:73:in
dispatch'
actionpack (3.2.9) lib/action
dispatch/routing/routeset.rb:36:in call'
journey (1.0.4) lib/journey/router.rb:68:in
block in call'
journey (1.0.4) lib/journey/router.rb:56:in each'
journey (1.0.4) lib/journey/router.rb:56:in
call'
actionpack (3.2.9) lib/action
dispatch/routing/routeset.rb:601:in call'
vendor/gems/message_bus/lib/message_bus/rack/middleware.rb:42:in
call'
sass (3.2.3) lib/sass/plugin/rack.rb:54:in call'
actionpack (3.2.9) lib/action_dispatch/middleware/best_standards_support.rb:17:in
call'
rack (1.4.1) lib/rack/etag.rb:23:in call'
rack (1.4.1) lib/rack/conditionalget.rb:25:in
call'
actionpack (3.2.9) lib/action
dispatch/middleware/head.rb:14:in call'
actionpack (3.2.9) lib/action_dispatch/middleware/params_parser.rb:21:in
call'
actionpack (3.2.9) lib/actiondispatch/middleware/flash.rb:242:in call'
rack (1.4.1) lib/rack/session/abstract/id.rb:205:in
context'
rack (1.4.1) lib/rack/session/abstract/id.rb:200:in call'
actionpack (3.2.9) lib/action_dispatch/middleware/cookies.rb:341:in
call'
activerecord (3.2.9) lib/active
record/querycache.rb:64:in call'
activerecord (3.2.9) lib/active_record/connection_adapters/abstract/connection_pool.rb:479:in
call'
actionpack (3.2.9) lib/action
dispatch/middleware/callbacks.rb:28:in block in call'
activesupport (3.2.9) lib/active_support/callbacks.rb:405:in
run769637742call1054697050callbacks'
activesupport (3.2.9) lib/active
support/callbacks.rb:405:in __run_callback'
activesupport (3.2.9) lib/active_support/callbacks.rb:385:in
runcallcallbacks'
activesupport (3.2.9) lib/active
support/callbacks.rb:81:in run_callbacks'
actionpack (3.2.9) lib/action_dispatch/middleware/callbacks.rb:27:in
call'
actionpack (3.2.9) lib/actiondispatch/middleware/reloader.rb:65:in call'
actionpack (3.2.9) lib/action_dispatch/middleware/remote_ip.rb:31:in
call'
actionpack (3.2.9) lib/action
dispatch/middleware/debugexceptions.rb:16:in call'
actionpack (3.2.9) lib/action_dispatch/middleware/show_exceptions.rb:56:in
call'
railties (3.2.9) lib/rails/rack/logger.rb:32:in call_app'
railties (3.2.9) lib/rails/rack/logger.rb:16:in
block in call'
activesupport (3.2.9) lib/active
support/taggedlogging.rb:22:in tagged'
railties (3.2.9) lib/rails/rack/logger.rb:16:in
call'
config/initializers/quiet
logger.rb:10:in call_with_quiet_assets'
config/initializers/silence_logger.rb:19:in
call'
actionpack (3.2.9) lib/actiondispatch/middleware/requestid.rb:22:in call'
rack (1.4.1) lib/rack/methodoverride.rb:21:in
call'
rack (1.4.1) lib/rack/runtime.rb:17:in call'
activesupport (3.2.9) lib/active_support/cache/strategy/local_cache.rb:72:in
call'
actionpack (3.2.9) lib/actiondispatch/middleware/static.rb:62:in call'
airbrake (3.1.2) lib/airbrake/rack.rb:42:in
call'
airbrake (3.1.2) lib/airbrake/user
informer.rb:12:in call'
/home/sam/.rvm/gems/ruby-1.9.3-p194-perf/bundler/gems/MiniProfiler-cf359967ec7b/Ruby/lib/mini_profiler/profiler.rb:310:in
call'
railties (3.2.9) lib/rails/engine.rb:479:in call'
railties (3.2.9) lib/rails/application.rb:223:in
call'
railties (3.2.9) lib/rails/railtie/configurable.rb:30:in method_missing'
thin (1.5.0) lib/thin/connection.rb:81:in
block in preprocess'
thin (1.5.0) lib/thin/connection.rb:79:in catch'
thin (1.5.0) lib/thin/connection.rb:79:in
pre
process'
thin (1.5.0) lib/thin/connection.rb:54:in process'
/home/sam/.rvm/gems/ruby-1.9.3-p194-perf/bundler/gems/thin-em-websocket-5aa856511441/lib/thin-em-websocket.rb:258:in
process'
thin (1.5.0) lib/thin/connection.rb:39:in receive_data'
/home/sam/.rvm/gems/ruby-1.9.3-p194-perf/bundler/gems/thin-em-websocket-5aa856511441/lib/thin-em-websocket.rb:269:in
receivedata'
eventmachine (1.0.0) lib/eventmachine.rb:187:in run_machine'
eventmachine (1.0.0) lib/eventmachine.rb:187:in
run'
thin (1.5.0) lib/thin/backends/base.rb:63:in start'
thin (1.5.0) lib/thin/server.rb:159:in
start'
thin (1.5.0) lib/thin/controllers/controller.rb:86:in start'
thin (1.5.0) lib/thin/runner.rb:187:in
run
command'
thin (1.5.0) lib/thin/runner.rb:152:in run!'
thin (1.5.0) bin/thin:6:in
'
/home/sam/.rvm/gems/ruby-1.9.3-p194-perf/bin/thin:19:in load'
/home/sam/.rvm/gems/ruby-1.9.3-p194-perf/bin/thin:19:in
'
/home/sam/.rvm/gems/ruby-1.9.3-p194-perf/bin/rubynoexecwrapper:14:in eval'
/home/sam/.rvm/gems/ruby-1.9.3-p194-perf/bin/ruby_noexec_wrapper:14:in
'

This means that there are 60 or so frames below my application. If I just want to gather a trace for my application code, I really want:

callerlocations(0, -60) ... I work around by doing callerlocations[0..-60] however the VM is going to do tons of work to grab all these objects just for me to discard them.

#6 Updated by Sam Saffron over 1 year ago

This means, I don't really know how many frames I want to take, I just know how many frames I want to discard.

#7 Updated by Koichi Sasada over 1 year ago

(2012/11/27 7:35), sam.saffron (Sam Saffron) wrote:

This means that there are 60 or so frames below my application. If I just want to gather a trace for my application code, I really want:

callerlocations(0, -60) ... I work around by doing callerlocations[0..-60] however the VM is going to do tons of work to grab all these objects just for me to discard them.

I know that Rails (and framework) has big backtrace array.

My question is: use-case of negative number for performance.
Your answer only shows "backtrace is big".

By the way, current implementation grabs all of backtrace information
and cuts n'th elements fromlevel' (n' is 2nd argument andlevel' is
1st argument). This is implementation limitation. We need to seek all
of backtrace to make correct backtrace. If you want to know "why it is
needed?", please read source code. Short answer is "There are some
frames which does not have location information".

--
// SASADA Koichi at atdot dot net

#8 Updated by Sam Saffron over 1 year ago

My question is: use-case of negative number for performance. Your answer only shows "backtrace is big".

Apologies, well for MiniProfiler ( https://github.com/SamSaffron/MiniProfiler/tree/master/Ruby ) we gather stack traces quite aggressively, every time a query is execute a backtrace is materialized.

A classic place of where I would like to cut down on backtrace overhead is the sampling profiler see: https://github.com/SamSaffron/MiniProfiler/blob/master/Ruby/lib/mini_profiler/profiler.rb#L289

Another use case would be a user option for :applicationtraceonly, that would figure out how many frames to skip in the first SQL interception and store that on the Thread so following calls to grab stack traces only include the "application" section and the framework stuff is not gathered.

The seek is still cheaper than materializing all the strings for the filenames and so on just to discard.

#9 Updated by Koichi Sasada over 1 year ago

(2012/11/27 15:52), sam.saffron (Sam Saffron) wrote:

Issue #7434 has been updated by sam.saffron (Sam Saffron).

My question is: use-case of negative number for performance. Your answer only shows "backtrace is big".

Apologies, well for MiniProfiler ( https://github.com/SamSaffron/MiniProfiler/tree/master/Ruby ) we gather stack traces quite aggressively, every time a query is execute a backtrace is materialized.

A classic place of where I would like to cut down on backtrace overhead is the sampling profiler see: https://github.com/SamSaffron/MiniProfiler/blob/master/Ruby/lib/mini_profiler/profiler.rb#L289

I think you need to grab all of stack each time.
I'm not sure the negative number is good for this reason.

Another use case would be a user option for :applicationtraceonly, that would figure out how many frames to skip in the first SQL interception and store that on the Thread so following calls to grab stack traces only include the "application" section and the framework stuff is not gathered.

You need to grab all of stack trace to check which is skipped frame or
not. Please correct my if my understanding is wrong.

I also am not sure why negative number is needed for this purpose.


Ah, I understand your purpose. I can't understand how to use negative
number.

But I understand now.

[top of stack frame]
caller
foo4
foo3
foo2
foo1
f/w3 # f/w = framework
f/w2
f/w1
main
[bottom of stack frame]

In this case, framework consumes 3 frames and you only want to know
stack frame only "all of frame size - framework frame size (=3)".

I missed the point that framework knows how many frames consumed (in
this case: 3).

2nd argument is "how many frames from top".

So your suggestion.
(2nd argument) `n' means:
if n > 0
how many frames from top of frame
elsif n <= 0
how many frames should eliminate from bottom of frame
end

I feel it makes sense.

The last point is API design.
"negative number" to this purpose is feasible?
Any other example for other methods?

--
// SASADA Koichi at atdot dot net

#10 Updated by Sam Saffron over 1 year ago

The last point is API design.
"negative number" to this purpose is feasible?

I like negative numbers cause it has some parity with the range APIs, eg: [1,2,3][0..-2] # skip last

Any other example for other methods?

I can not think of a use case for for the first param being negative, even though for arrays [1,2,3][-2..-1] makes sense, I can not think of a case where one would do caller_locations(-10, -1), the proposal is all about making the second param more flexible.

#11 Updated by Koichi Sasada over 1 year ago

(2012/11/27 18:35), sam.saffron (Sam Saffron) wrote:

The last point is API design.
"negative number" to this purpose is feasible?
I like negative numbers cause it has some parity with the range APIs, eg: [1,2,3][0..-2] # skip last

I agree that it is similar to the negative end of range.
However, range points position (index), not a size.

I think similar, but different concept cause confusion.

Ideas:

(1) Accept your idea.
Define new concept.
(Do not refer Array#[])

(2) Introduce 3rd argument to specify eliminate
I feel it is bad.

(3) Consider argument

(3-1) Accept Range object on 1st parameter
caller(2..-2) #=> [foo2, ..., f/w2] on example.

(3-2) ... no idea

(3-1) seems good? It is same concept of Array#[]. Easy to explain.

Any other example for other methods?
I can not think of a use case for for the first param being negative, even though for arrays 1,2,3 makes sense, I can not think of a case where one would do caller_locations(-10, -1), the proposal is all about making the second param more flexible.

I want to know other similar methods we can mimic.

--
// SASADA Koichi at atdot dot net

#12 Updated by Sam Saffron over 1 year ago

I think either 1) or 3-1), works ok.

Though there is an issue with accepting ranges: caller(1..-6, 8) becomes a bit weird cause you are defining the length in two spots.

I can not find any other place with a similar api, anyone else?

#13 Updated by Koichi Sasada over 1 year ago

(2012/11/28 6:08), sam.saffron (Sam Saffron) wrote:

Though there is an issue with accepting ranges: caller(1..-6, 8) becomes a bit weird cause you are defining the length in two spots.

It should be error.

See:

[][0..1, 2]
#=>
t.rb:1:in []': can't convert Range into Integer (TypeError)
from t.rb:1:in
'

--
// SASADA Koichi at atdot dot net

#14 Updated by Koichi Sasada over 1 year ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r37957.
Sam, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • vmbacktrace.c (vmbacktracetoary): support range argument like Array#[]. [ruby-trunk - Feature #7434] Test and document is not available. Please help us.

#15 Updated by Koichi Sasada over 1 year ago

(2012/11/28 6:08), sam.saffron (Sam Saffron) wrote:

I think either 1) or 3-1), works ok.

I committed (3-1).

Could you check it?
Also I'm very happy if you write tests for it.

--
// SASADA Koichi at atdot dot net

#16 Updated by Sam Saffron over 1 year ago

@ko1 will try to write some tests next week.

On first go I got a segfault:

(pry):1: [BUG] backtrace_collect: unreachable
ruby 2.0.0dev (2012-11-30) [i686-linux]

-- Control frame information -----------------------------------------------
c:0024 p:---- s:0096 e:000095 CFUNC :callerlocations
c:0023 p:0009 s:0091 e:000090 EVAL (pry):1 [FINISH]
c:0022 p:---- s:0089 e:000088 CFUNC :eval
c:0021 p:0089 s:0083 e:000082 METHOD /home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pry
instance.rb:275
c:0020 p:0037 s:0076 e:000075 METHOD /home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pryinstance.rb:251
c:0019 p:0012 s:0071 e:000070 BLOCK /home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pry
instance.rb:231 [FINISH]
c:0018 p:---- s:0069 e:000068 CFUNC :loop
c:0017 p:0007 s:0066 e:000065 BLOCK /home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pryinstance.rb:232 [FINISH]
c:0016 p:---- s:0064 e:000063 CFUNC :catch
c:0015 p:0009 s:0060 e:000059 BLOCK /home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pry
instance.rb:229 [FINISH]
c:0014 p:---- s:0058 e:000057 CFUNC :catch
c:0013 p:0051 s:0054 e:000053 METHOD /home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pryinstance.rb:228
c:0012 p:0192 s:0048 e:000047 METHOD /home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pry
class.rb:154
c:0011 p:0204 s:0041 e:000040 BLOCK /home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/cli.rb:171 [FINISH]
c:0010 p:---- s:0035 e:000034 CFUNC :call
c:0009 p:0012 s:0031 e:000030 BLOCK /home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/cli.rb:65 [FINISH]
c:0008 p:---- s:0028 e:000027 CFUNC :each
c:0007 p:0087 s:0025 e:000024 METHOD /home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/cli.rb:65
c:0006 p:0030 s:0020 e:000019 TOP /home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/bin/pry:16 [FINISH]
c:0005 p:---- s:0018 e:000017 CFUNC :load
c:0004 p:0099 s:0014 e:001ac8 EVAL /home/sam/.rvm/gems/ruby-head/bin/pry:19 [FINISH]
c:0003 p:---- s:0011 e:000010 CFUNC :eval
c:0002 p:0077 s:0005 e:0019a8 EVAL /home/sam/.rvm/gems/ruby-head/bin/rubynoexecwrapper:14 [FINISH]
c:0001 p:0000 s:0002 e:000574 TOP [FINISH]

/home/sam/.rvm/gems/ruby-head/bin/rubynoexecwrapper:14:in <main>'
/home/sam/.rvm/gems/ruby-head/bin/ruby_noexec_wrapper:14:in
eval'
/home/sam/.rvm/gems/ruby-head/bin/pry:19:in <main>'
/home/sam/.rvm/gems/ruby-head/bin/pry:19:in
load'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/bin/pry:16:in <top (required)>'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/cli.rb:65:in
parseoptions'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/cli.rb:65:in each'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/cli.rb:65:in
block in parse
options'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/cli.rb:65:in call'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/cli.rb:171:in
block in '
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pryclass.rb:154:in start'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pry_instance.rb:228:in
repl'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pry
instance.rb:228:in catch'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pry_instance.rb:229:in
block in repl'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pryinstance.rb:229:in catch'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pry_instance.rb:232:in
block (2 levels) in repl'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pry
instance.rb:232:in loop'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pry_instance.rb:231:in
block (3 levels) in repl'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pryinstance.rb:251:in rep'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pry_instance.rb:275:in
re'
/home/sam/.rvm/gems/ruby-head/gems/pry-0.9.10/lib/pry/pry
instance.rb:275:in eval'
(pry):1:in
pry'
(pry):1:in `caller_locations'

-- C level backtrace information -------------------------------------------
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1ab92c) [0xb76d492c] vmdump.c:646
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x5ad3d) [0xb7583d3d] error.c:306
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(rb
bug+0x40) [0xb7584d40] error.c:325
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1ace51) [0xb76d5e51] vmbacktrace.c:478
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1ace9f) [0xb76d5e9f] vm
backtrace.c:840
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19301e) [0xb76bc01e] vminsnhelper.c:1318
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1964df) [0xb76bf4df] vm
insnhelper.c:1462
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a3d77) [0xb76ccd77] vminsnhelper.c:1552
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19a330) [0xb76c3330] insns.def:1003
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19f757) [0xb76c8757] vm.c:1156
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19fdbe) [0xb76c8dbe] vm
eval.c:1208
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a02b9) [0xb76c92b9] vmeval.c:1249
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x6890f) [0xb759190f] proc.c:382
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19301e) [0xb76bc01e] vm
insnhelper.c:1318
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1964df) [0xb76bf4df] vminsnhelper.c:1462
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a3d77) [0xb76ccd77] vm
insnhelper.c:1552
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19a91a) [0xb76c391a] insns.def:1018
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19f757) [0xb76c8757] vm.c:1156
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a4a49) [0xb76cda49] vm.c:627
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(rbrescue2+0x173) [0xb758c8b3] eval.c:714
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x195442) [0xb76be442] vm
eval.c:981
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19303e) [0xb76bc03e] vminsnhelper.c:1324
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1964df) [0xb76bf4df] vm
insnhelper.c:1462
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a3d77) [0xb76ccd77] vminsnhelper.c:1552
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19a330) [0xb76c3330] insns.def:1003
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19f757) [0xb76c8757] vm.c:1156
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a538d) [0xb76ce38d] vm.c:627
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(rb
catchobj+0xc9) [0xb76c0fc9] vmeval.c:1766
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x198097) [0xb76c1097] vmeval.c:1742
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19301e) [0xb76bc01e] vm
insnhelper.c:1318
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1964df) [0xb76bf4df] vminsnhelper.c:1462
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a3d77) [0xb76ccd77] vm
insnhelper.c:1552
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19a330) [0xb76c3330] insns.def:1003
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19f757) [0xb76c8757] vm.c:1156
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a538d) [0xb76ce38d] vm.c:627
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(rbcatchobj+0xc9) [0xb76c0fc9] vmeval.c:1766
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x198097) [0xb76c1097] vm
eval.c:1742
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19301e) [0xb76bc01e] vminsnhelper.c:1318
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1964df) [0xb76bf4df] vm
insnhelper.c:1462
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a3d77) [0xb76ccd77] vminsnhelper.c:1552
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19a330) [0xb76c3330] insns.def:1003
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19f757) [0xb76c8757] vm.c:1156
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a06a6) [0xb76c96a6] vm.c:627
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x6ac1d) [0xb7593c1d] proc.c:566
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19301e) [0xb76bc01e] vm
insnhelper.c:1318
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1964df) [0xb76bf4df] vminsnhelper.c:1462
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a3d77) [0xb76ccd77] vm
insnhelper.c:1552
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19a91a) [0xb76c391a] insns.def:1018
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19f757) [0xb76c8757] vm.c:1156
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(rbyield+0x173) [0xb76ce9f3] vm.c:627
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(rb
aryeach+0x54) [0xb754a144] array.c:1677
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19303e) [0xb76bc03e] vm
insnhelper.c:1324
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1964df) [0xb76bf4df] vminsnhelper.c:1462
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a3d77) [0xb76ccd77] vm
insnhelper.c:1552
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19a330) [0xb76c3330] insns.def:1003
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19f757) [0xb76c8757] vm.c:1156
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(rbiseqeval+0x109) [0xb76cece9] vm.c:1391
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x663ee) [0xb758f3ee] load.c:557
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x66cba) [0xb758fcba] load.c:639
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19301e) [0xb76bc01e] vminsnhelper.c:1318
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1964df) [0xb76bf4df] vm
insnhelper.c:1462
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a3d77) [0xb76ccd77] vminsnhelper.c:1552
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19a330) [0xb76c3330] insns.def:1003
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19f757) [0xb76c8757] vm.c:1156
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19fdbe) [0xb76c8dbe] vm
eval.c:1208
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a02b9) [0xb76c92b9] vmeval.c:1249
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19301e) [0xb76bc01e] vm
insnhelper.c:1318
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1964df) [0xb76bf4df] vminsnhelper.c:1462
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x1a3d77) [0xb76ccd77] vm
insnhelper.c:1552
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19a330) [0xb76c3330] insns.def:1003
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x19f757) [0xb76c8757] vm.c:1156
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(rbiseqevalmain+0x15d) [0xb76ceead] vm.c:1404
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(+0x61e3c) [0xb758ae3c] eval.c:250
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(ruby
execnode+0x24) [0xb758c2a4] eval.c:315
/home/sam/.rvm/rubies/ruby-head/lib/libruby.so.2.0(ruby
runnode+0x36) [0xb758e236] eval.c:307
pry() [0x8048698]
/lib/i386-linux-gnu/libc.so.6(
libcstart_main+0xf3) [0xb73804d3]
pry() [0x80486c1]

#17 Updated by Koichi Sasada over 1 year ago

(2012/11/30 10:25), sam.saffron (Sam Saffron) wrote:

@ko1 will try to write some tests next week.

Thank you so much.

On first go I got a segfault:

Cool!
Reproduce code?

--
// SASADA Koichi at atdot dot net

#18 Updated by Sam Saffron over 1 year ago

Getting it on a clean rvm install of ruby-head with

test.rb
caller_location(0,-1)

I hope my compile is correct, other stuff seems to work fine

#19 Updated by Zachary Scott over 1 year ago

  • Status changed from Closed to Assigned

I have committed a test for range argument in r38664, please check it.

Also available in: Atom PDF