2013-10-01 31 views
7

我在android中看到這兩個分段錯誤。 一個表示SEGV_MAPERR,另一個表示SEGV_ACCERR。分段錯誤中'code'的含義是什麼

你能告訴我這兩個有什麼區別嗎?

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 41963214 

signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 4006e000 

謝謝。

+0

'SEGV_MAPERR'是內存分配錯誤(懸掛指針,內存溢出等),'SEGV_ACCERR'是內存訪問錯誤,通常是權限。或者你在尋找更多的東西? – Simon

+0

說SEGV_ACCERR是由堆棧損壞引起的嗎? – michael

+0

嗯,我想這可能是如果你使用堆棧指針來訪問你沒有權限的內存,但似乎不太可能。你在做什麼? – Simon

回答

12

siginfo.h

SEGV_MAPERR意味着你試圖訪問一個不映射到任何一個地址。

SEGV_ACCERR表示您試圖訪問您無權訪問的地址。

因此,在這兩種情況下,您都訪問了一個您不應該擁有的地址,這可能是您的實際代碼犯的唯一一個地址。在前一種情況下,無論如何,該地址範圍內都沒有內存。在後一種情況下,該地址範圍內有內存,但您不擁有它。

如果您要訪問一個隨機地址,那麼您將獲得哪個地址取決於該操作系統在當時如何設置您的進程。

0

如果您訪問像*((int*)0)=1這樣的內存,您將獲得SEGV_MAPERR

如果你保護的內存mprotect(2),例如,mprotect(buffer, pagesize, PROT_READ),那麼你修改了記憶像*(buffer)=1,你會得到SEGV_ACCERR

請詳細說明man mprotect

相關問題