我正在學習gdb,並且我得到了第一個錯誤。這是錯誤:這是一個內存地址嗎?
0x00007fff83074096 in __kill()
是地址:
0x00007fff83074096
...十六進制格式的內存地址?我已經將它轉換爲十進制,出於興趣,而且數量很大。我不相信有這麼多的內存地址存在。
我正在學習gdb,並且我得到了第一個錯誤。這是錯誤:這是一個內存地址嗎?
0x00007fff83074096 in __kill()
是地址:
0x00007fff83074096
...十六進制格式的內存地址?我已經將它轉換爲十進制,出於興趣,而且數量很大。我不相信有這麼多的內存地址存在。
如果您在64位平臺上運行,那麼是的,存在大量的地址。 (另請參閱:http://en.wikipedia.org/wiki/Virtual_address)
當然,您可能只是在某處發生了緩衝區溢出,導致了您的堆棧損壞,並且用無意義的方式覆蓋了該地址。
緩衝區溢出顯然與此有關 - GDB將地址解析爲__kill。 –
@Employed:你怎麼知道緩衝區溢出沒有覆蓋堆棧中的返回地址,並且我們沒有被隨機拋入這個函數? –
我知道,因爲崩潰地址不是(通常)位於堆棧上 - 它直接來自內核。當你看到堆棧損壞時,你總能得到正確的崩潰點(在過去的15年中我見過的每個UNIX系統上)。你只是看不到其他的調用堆棧。嘗試一個破壞堆棧並親自查看的測試用例。下面是一個保存你輸入:void foo(){char buf [1],* p = buf; while(p){* p ++ ='a'; }} int main(){foo();}}返回0; } –
16個進制數字×4(由一個十六進制數字表示的位)= 64位。你正在使用64位平臺,你爲什麼感到驚訝?
是的,它是一個內存地址。由於paging,可用內存地址大大超過實際內存的返回的虛擬地址空間。
您可能會發現運行pmap -x 1
或pmap -x $$
具有指導性,同時查看/proc/pid/maps
內容的不同過程。 (cat /proc/self/maps
很容易運行。)
...你在64位模式下運行它嗎? –
爲什麼-1?這是一個真正的問題。我在計算機科學課程上學習。我已經看到了十六進制的內存地址,但沒有接近那個大的地方,這就是爲什麼我問它的格式。 –
@Matti我正在運行一個新的Macbook Pro。我認爲它的64位是。 –