123456789_123456789_123456789_123456789_123456789_

Class: Thread::Backtrace

Relationships & Source Files
Namespace Children
Classes:
Inherits: Object
Defined in: vm_backtrace.c

Overview

An internal representation of the backtrace. The user will never interact with objects of this class directly, but class methods can be used to get backtrace settings of the current session.

Class Method Summary

  • .limit ⇒ Integer

    Returns maximum backtrace length set by --backtrace-limit command-line option.

Instance Method Summary

Class Method Details

.limitInteger

Returns maximum backtrace length set by --backtrace-limit command-line option. The default is -1 which means unlimited backtraces. If the value is zero or positive, the error backtraces, produced by Exception#full_message, are abbreviated and the extra lines are replaced by ... 3 levels...

$ ruby -r net/http -e "p Thread::Backtrace.limit; Net::HTTP.get(URI('http://wrong.address'))"
- 1
#.../lib/ruby/3.1.0/socket.rb:227:in `getaddrinfo': Failed to open TCP connection to wrong.address:80 (getaddrinfo: Name or service not known) (SocketError)
    from .../lib/ruby/3.1/socket.rb:227:in `foreach'
    from .../lib/ruby/3.1.0/socket.rb:632:in `tcp'
    from .../lib/ruby/3.1.0/net/http.rb:998:in `connect'
    from .../lib/ruby/3.1/net/http.rb:976:in `do_start'
    from .../lib/ruby/3.1.0/net/http.rb:965:in `start'
    from .../lib/ruby/3.1.0/net/http.rb:627:in `start'
    from .../lib/ruby/3.1/net/http.rb:503:in `get_response'
    from .../lib/ruby/3.1.0/net/http.rb:474:in `get'
#.../lib/ruby/3.1.0/socket.rb:227:in `getaddrinfo': getaddrinfo: Name or service not known (SocketError)
    from .../lib/ruby/3.1/socket.rb:227:in `foreach'
    from .../lib/ruby/3.1.0/socket.rb:632:in `tcp'
    from .../lib/ruby/3.1.0/net/http.rb:998:in `connect'
    from .../lib/ruby/3.1/net/http.rb:976:in `do_start'
    from .../lib/ruby/3.1.0/net/http.rb:965:in `start'
    from .../lib/ruby/3.1.0/net/http.rb:627:in `start'
    from .../lib/ruby/3.1/net/http.rb:503:in `get_response'
    from .../lib/ruby/3.1.0/net/http.rb:474:in `get'
    from -e:1:in `<main>'

$ ruby --backtrace-limit 2 -r net/http -e "p Thread::Backtrace.limit; Net::HTTP.get(URI('http://wrong.address'))"
2
#.../lib/ruby/3.1.0/socket.rb:227:in `getaddrinfo': Failed to open TCP connection to wrong.address:80 (getaddrinfo: Name or service not known) (SocketError)
    from .../lib/ruby/3.1/socket.rb:227:in `foreach'
    from .../lib/ruby/3.1.0/socket.rb:632:in `tcp'
     #... 7 levels...
#.../lib/ruby/3.1.0/socket.rb:227:in `getaddrinfo': getaddrinfo: Name or service not known (SocketError)
    from .../lib/ruby/3.1/socket.rb:227:in `foreach'
    from .../lib/ruby/3.1.0/socket.rb:632:in `tcp'
     #... 7 levels...

$ ruby --backtrace-limit 0 -r net/http -e "p Thread::Backtrace.limit; Net::HTTP.get(URI('http://wrong.address'))"
0
#.../lib/ruby/3.1.0/socket.rb:227:in `getaddrinfo': Failed to open TCP connection to wrong.address:80 (getaddrinfo: Name or service not known) (SocketError)
     #... 9 levels...
#.../lib/ruby/3.1.0/socket.rb:227:in `getaddrinfo': getaddrinfo: Name or service not known (SocketError)
     #... 9 levels...
[ GitHub ]

  
# File 'vm_backtrace.c', line 952

static VALUE
backtrace_limit(VALUE self)
{
    return LONG2NUM(rb_backtrace_length_limit);
}

Instance Method Details

#clone

This method is for internal use only.
[ GitHub ]

  
# File 'vm_backtrace.c', line 959

static VALUE
backtrace_clone(VALUE self)
{
    rb_backtrace_t *bt;
    TypedData_Get_Struct(self, rb_backtrace_t, &backtrace_data_type, bt);

    rb_backtrace_t *other_bt;
    VALUE clone = backtrace_alloc_capa(bt->backtrace_size, &other_bt);

    rb_obj_clone_setup(self, clone, Qfalse);

    return clone;
}

#dup

This method is for internal use only.
[ GitHub ]

  
# File 'vm_backtrace.c', line 974

static VALUE
backtrace_dup(VALUE self)
{
    rb_notimplement();

    UNREACHABLE_RETURN(Qnil);
}

#initialize_copy(original)

This method is for internal use only.
[ GitHub ]

  
# File 'vm_backtrace.c', line 983

static VALUE
backtrace_initialize_copy(VALUE self, VALUE original)
{
    rb_backtrace_t *bt;
    TypedData_Get_Struct(self, rb_backtrace_t, &backtrace_data_type, bt);

    rb_backtrace_t *original_bt;
    TypedData_Get_Struct(original, rb_backtrace_t, &backtrace_data_type, original_bt);

    bt->backtrace_size = original_bt->backtrace_size;
    MEMCPY(bt->backtrace, original_bt->backtrace, rb_backtrace_location_t, original_bt->backtrace_size);

    return Qnil;
}