2010-03-08 56 views
10

是否有紅寶石任何方式來獲得對象的內存地址..在ruby中訪問對象的內存地址?

說..

(I = 5)是可能獲得該對象5的MEM地址..

我一直在嘗試過一段時間才能得到這個..,

任何答案將非常感激......

感謝,

Regards levirg

+10

爲什麼?你想做什麼? – SLaks 2010-03-08 15:13:43

回答

3

我不知道有確切的地址,但也許你正在尋找像object_id方法的東西?從其documentation

提取物返回物鏡的整數標識符。
同樣的號碼將所有呼叫返回到ID爲給定的對象,並沒有兩個活動對象將共享一個ID


例子:

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

Ruby Memory Validator應該能夠把它拉開,但它不是免費的。

Aman Gupta patched Joe Damatos​​但它似乎是 work in progress,我從來沒有在我的機器上運行它。 Joe在他的 blog上有一些關於memprof和其他低級別內容的非常好的帖子。

現在我不太確定他們真的可以。整數存儲爲Fixnum,而Fixnum不是通常的Ruby對象,它只是看起來這樣。 Ruby使用巧妙的加速技巧與object_id來使Fixnum對象具有immidiate值。該號碼實際上存儲在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 

一個Fixnumobject_id實際上是由比特移位到左邊,然後設置至少顯著位創建。

50b101object_id5是二進制11110b1011是。

47110b0001001001100111,左移並設置位,你會得到0b0010010011001111那就是9423這恰好是object_id以上z

This behaviour最有可能是實現特定的,但我不知道這樣處理Fixnum的Ruby實現。

Ruby中至少有三個直接對象,即false,truenil

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

它似乎memprof工作良好的64位,我的是32位.....謝謝 – levirg 2010-03-09 05:00:41

+0

謝謝,我錯過了memprof的自述。我也在32位。有關Ruby如何存儲Fixnum的說明,請參閱上文。 – 2010-03-09 08:30:48

+0

這是偉大的,我已經從中學到了一些東西...謝謝你.. – levirg 2010-03-09 09:04:14

0

你究竟想要做什麼?

請記住,Ruby對象不是直接類似於C或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 

即使通過ab是分開的變量,它們是相同的底層數據的引用,並且具有相同object_id

如果您發現自己需要獲取變量的地址,那麼無論您想要做什麼,都可能有一個更簡單的方法。

+0

我只是想知道如何引用對象工作的紅寶石,所以我認爲地址將是有用的,要完成的事情.....如果有更好的方式請幫助我...謝謝 – levirg 2010-03-09 05:31:37

+0

你不應該擔心在Ruby中引用一個對象。與其他語言相比,您可以通過值或引用傳遞對象,Ruby將爲您處理所有低級別方面。所有你需要做的就是使用這個對象,並且像在C中傳遞值一樣傳遞它。有關Ruby內部的更多信息,請參見http://www.ruby-doc.org/docs/ ProgrammingRuby/language.html。 – bta 2010-03-09 22:11:39

1

Ruby Memory Validator確實爲您提供了該對象的內存地址。

Joe Damato的作品(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)基於軟件驗證爲創建Ruby內存檢查API(http://www.softwareverify.com/ruby/customBuild/index.html)所做的工作。

喬在他的博客中描述過。因此喬的工作也應該返回適​​當的地址。我並未完全瞭解最新版本的Joe的工作 - 他只告訴我有關第一個版本,而不是最新版本,但是,如果您在Ruby的基礎上跟蹤內存分配,那麼您正在跟蹤地址無論你正在分配什麼東西。

這並不意味着您可以取消引用地址並讀取您希望在該地址找到的數據值。解引用地址將指向基本Ruby對象的內部。 Ruby對象是一個基本對象,然後將附加數據存儲在一起,因此,除非您正在編寫像Ruby Memory Validator或memprof這樣的工具,否則瞭解實際地址並不是非常有用。

我如何知道上面關於Ruby Memory Validator和我們發佈的API?我設計了Ruby Memory Validator。我還編寫了攔截分配內存的Ruby調用的彙編語言位。

0

你既然標明(埋在評論的地方),你真的只是想了解Ruby的是如何引用的東西,我想工作的事情如下:

在Ruby的C API一個VALUE代表對象(一nilFixNumBoolean)或指向Object的指針。 VALUE包含一個3位標記,指示它們是哪一個,並且包含值(對於前3個)或直接存儲器指針(對於Object)。在Ruby中無法直接獲取VALUE(我不確定object_id是相同還是不同)。

請注意,JRuby的運行方式不同。

9

是的。

從「Fiddling with Ruby’s Fiddle」:

「你可以通過拍攝物體的ID,做一個按位左移得到一個對象的實際指針值這會給你的指針(或內存位置)的紅寶石對象在內存中。「

使用您的i = 5例如它可以做像這樣:

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

In Ruby, why does inspect() print out some kind of object id which is different from what object_id() gives?」有更多的信息關於object_id,包括簡要介紹了C源代碼,你可能會發現有用的執行標的。

看看「Fiddle」,你可以做一些其他很酷的事情。

+0

不知道爲什麼這個答案不是更多投票,這有助於巨大!如果你有'foo = Class.new',那麼'foo.to_s'返回類似於「#」的東西。查看Ruby源代碼,該字符串被分配給@tmp_classpath。但是,一旦將此對象分配給常量,「Foo = foo」,「foo.to_s」將返回「Foo」,並且將移除@tmp_classpath。我在常量賦值之前和之後都有調試消息,現在可以使用'(foo.object_id << 1).to_s(16)'將它們配對。 – fastryan 2016-02-17 19:56:30