我在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
謝謝。
我在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
謝謝。
SEGV_MAPERR意味着你試圖訪問一個不映射到任何一個地址。
SEGV_ACCERR表示您試圖訪問您無權訪問的地址。
因此,在這兩種情況下,您都訪問了一個您不應該擁有的地址,這可能是您的實際代碼犯的唯一一個地址。在前一種情況下,無論如何,該地址範圍內都沒有內存。在後一種情況下,該地址範圍內有內存,但您不擁有它。
如果您要訪問一個隨機地址,那麼您將獲得哪個地址取決於該操作系統在當時如何設置您的進程。
如果您訪問像*((int*)0)=1
這樣的內存,您將獲得SEGV_MAPERR
。
如果你保護的內存mprotect(2)
,例如,mprotect(buffer, pagesize, PROT_READ)
,那麼你修改了記憶像*(buffer)=1
,你會得到SEGV_ACCERR
。
請詳細說明man mprotect
。
'SEGV_MAPERR'是內存分配錯誤(懸掛指針,內存溢出等),'SEGV_ACCERR'是內存訪問錯誤,通常是權限。或者你在尋找更多的東西? – Simon
說SEGV_ACCERR是由堆棧損壞引起的嗎? – michael
嗯,我想這可能是如果你使用堆棧指針來訪問你沒有權限的內存,但似乎不太可能。你在做什麼? – Simon