2011-06-27 50 views
3

我正在學習gdb,並且我得到了第一個錯誤。這是錯誤:這是一個內存地址嗎?

0x00007fff83074096 in __kill() 

是地址:

0x00007fff83074096 

...十六進制格式的內存地址?我已經將它轉換爲十進制,出於興趣,而且數量很大。我不相信有這麼多的內存地址存在。

+2

...你在64位模式下運行它嗎? –

+0

爲什麼-1?這是一個真正的問題。我在計算機科學課程上學習。我已經看到了十六進制的內存地址,但沒有接近那個大的地方,這就是爲什麼我問它的格式。 –

+0

@Matti我正在運行一個新的Macbook Pro。我認爲它的64位是。 –

回答

5

如果您在64位平臺上運行,那麼是的,存在大量的地址。 (另請參閱:http://en.wikipedia.org/wiki/Virtual_address

當然,您可能只是在某處發生了緩衝區溢出,導致了您的堆棧損壞,並且用無意義的方式覆蓋了該地址。

+0

緩衝區溢出顯然與此有關 - GDB將地址解析爲__kill。 –

+1

@Employed:你怎麼知道緩衝區溢出沒有覆蓋堆棧中的返回地址,並且我們沒有被隨機拋入這個函數? –

+0

我知道,因爲崩潰地址不是(通常)位於堆棧上 - 它直接來自內核。當你看到堆棧損壞時,你總能得到正確的崩潰點(在過去的15年中我見過的每個UNIX系統上)。你只是看不到其他的調用堆棧。嘗試一個破壞堆棧並親自查看的測試用例。下面是一個保存你輸入:void foo(){char buf [1],* p = buf; while(p){* p ++ ='a'; }} int main(){foo();}}返回0; } –

5

是。它是。

它是64位進程的虛擬內存空間中的地址。

並非所有的地址都在使用中(這就是一個地址:它只是一個標籤)。

你可以看到更多的地址做

:break 0x00007fff83074096 
:list 0x00007fff83074096 
:disassemble 0x00007fff83074096 

看到整個堆棧bactkrace

:bt full 

在所有線程

:thread apply all bt full 
+1

你寫了640位。 – Marcin

+1

不再:) :) tx – sehe

2

16個進制數字×4(由一個十六進制數字表示的位)= 64位。你正在使用64位平臺,你爲什麼感到驚訝?

3

是的,它是一個內存地址。由於paging,可用內存地址大大超過實際內存的返回的虛擬地址空間。

您可能會發現運行pmap -x 1pmap -x $$具有指導性,同時查看/proc/pid/maps內容的不同過程。 (cat /proc/self/maps很容易運行。)