Доступ к адресу памяти объектов в рубине..?

Есть ли какой-либо способ в ruby ​​получить адрес памяти объектов.

скажем..

(i = 5) позволяет получить адрес mem этого объекта 5..

Я пытаюсь получить это в течение некоторого времени..,

Любой ответ был бы действительно оценен...

спасибо,

С уважением levirg

Ответ 1

Да.

Из " Возиться с Руби Фиддл ":

"Вы можете получить фактическое значение указателя объекта, взяв идентификатор объекта и выполнив битовое смещение влево. Это даст вам указатель (или область памяти) объекта ruby в памяти".

Используя ваш пример с i = 5 это можно сделать так:

i = 5
i_ptr_int = i.object_id << 1
=> 22

" В Ruby почему inspect() выводит какой-то идентификатор объекта, который отличается от того, что дает object_id()? ", В котором содержится дополнительная информация об object_id, включая краткое введение в источник C, лежащий в основе реализации, которая может оказаться полезной.

Взгляните на " Fiddle ", чтобы узнать о некоторых других интересных вещах, которые вы можете сделать.

Ответ 2

Ruby Memory Validator должен быть в состоянии отключить это, но это не бесплатно.

Аман Гупта исправлен Joe Damatos memprof, но это работает , и я никогда не запускал его на своей машине. У Джо есть пара действительно хороших сообщений о memprof и других материалах низкого уровня в блоге .

Теперь я не уверен, что они действительно могут. Целые элементы хранятся как Fixnum, а Fixnum - не обычный объект Ruby, он просто выглядит именно так. Ruby использует умный ускоренный трюк с object_id, чтобы сделать объекты Fixnum неизменными. Фактически, число хранится в самой object_id. Поэтому два разных Fixnum, содержащих одно и то же значение, имеют одинаковый object_id.

>> x=5
=> 5
>> y=5
=> 5
>> x.object_id
=> 11
>> y.object_id
=> 11
>> z=4711
=> 4711
>> z.object_id
=> 9423

object_id Fixnum фактически создается путем смещения бит влево, а затем установки младшего значащего бита.

5 - 0b101, а object_id для 5 - 11 и 11 в двоичном формате 0b1011.

4711 - это 0b0001001001100111, сдвиг влево и установка бит, и вы получите 0b0010010011001111, а это 9423, который является object_id для z выше.

Это поведение, скорее всего, связано с реализацией, но я не знаю о реализации Ruby, которая не обрабатывает Fixnum таким образом.

В Ruby есть как минимум еще три объекта: false, true и nil.

>> false.object_id
=> 0
>> true.object_id
=> 2
>> nil.object_id
=> 4

Ответ 3

Я не знаю способа иметь точный адрес, но, возможно, вы ищете что-то вроде метода object_id?

Извлечь из документация

Возвращает целочисленный идентификатор для obj.
Тот же номер будет возвращен при всех вызовах id для данного объекта, а два активных объекта не будут совместно использовать id


Пример:

> 5.object_id
=> 11
> true.object_id
=> 2

Ответ 4

Ruby Memory Validator дает вам адрес памяти для объекта.

Работа Джо Дамато (http://timetobleed.com/plugging-ruby-memory-leaks-heapstack-dump-patches-to-help-take-out-the-trash) и (http://timetobleed.com/memprof-a-ruby-level-memory-profiler) основано на работе Software Verification, сделанной для создания API проверки Ruby памяти (http://www.softwareverify.com/ruby/customBuild/index.html).

Джо описывает это в своем блоге. Поэтому работа Джо должна также вернуть соответствующие адреса. Я не в полной мере ускоряюсь с последней версией Joe work - он рассказал мне только о первой версии, а не о последней версии, но, тем не менее, если вы отслеживаете выделение памяти в основе Ruby, вы отслеживаете адреса объектов, которые содержат то, что вы выделяете.

Это не значит, что вы можете разыменовать адрес и прочитать значение данных, которое вы ожидаете найти по этому адресу. Разделение адреса указывает на внутренние элементы базового объекта Ruby. Объекты Ruby являются основным объектом, который затем хранит дополнительные данные вместе, поэтому знание фактического адреса не очень полезно, если вы не пишете такой инструмент, как Ruby Memory Validator или memprof.

Как узнать выше о Ruby Memory Validator и API, который мы выпустили? Я разработал Ruby Memory Validator. Я также написал биты языка ассемблера, которые перехватывают вызовы Ruby, которые выделяют память.

Ответ 5

Что именно вы пытаетесь сделать?

Имейте в виду, что объект Ruby не является прямым аналогом переменной на языке C или С++. Например:

a = "foo"
b = a
b[2] = 'b'
b
  => "fob"
a
  => "fob"
a == b
  => true
a.object_id
  => 23924940
b.object_id
  => 23924940
a.object_id == b.object_id
  => true

Даже через a и b являются отдельными переменными, они являются ссылками на одни и те же базовые данные и имеют те же object_id.

Если вам нужно принять адрес переменной, возможно, вам будет проще использовать все, что вы пытаетесь сделать.

Ответ 6

Поскольку вы указали (где-то где-то где-то где-то), вы действительно пытаетесь понять, как Ruby ссылается на вещи, я думаю, что все работает следующим образом:

A VALUE в Ruby C api представляет объект (a nil, a FixNum или Boolean) или указатель на Object. VALUE содержит трехбитовый тег, указывающий, какой из них он содержит, и содержит значение (для первого 3) или указатель прямой памяти (для Object). Невозможно добраться до VALUE непосредственно в Ruby (я не уверен, что object_id тот же или другой.)

Обратите внимание, что JRuby работает по-разному.

Ответ 7

В Ruby у каждого созданного объекта есть связанный Symbol, они содержат реальный идентификатор объекта, перед ним стоит двоеточие (:), поэтому, чтобы получить адрес памяти объекта, необходимо вызвать метод object_id с объектом Символ не сам объект. Пример:

integer = 10
integer.object_id # => 21
# you can see it clearly gives the wrong output
# now use its Symbol: 
:integer.object_id # => 921236
# which is integer value of the object address.