2011-03-22 79 views
2

我正在寫使用MonoTouch的iPhone應用程序,最近應用程序已經開始崩潰,說明MPROTECT errno的12(ENOMEM)

Mprotect failed at 0x863a000 (length 8192) with errno 12 

其次是一個相當過長的堆棧跟蹤和跳板通知「的應用程序退出的說明與信號6「異常。

I've read this question其中規定該應用程序已經耗盡了iPhone上的所有可用內存。 我們已經對應用程序應用了一些通用的Dispose模式,並且通常會盡快處理任何重物。這意味着應用程序現在使用更少的內存運行。但是,我們仍然收到MProtect失敗的消息。

另外值得一提的是,在儀器下運行應用程序時,儀器報告設備有大量可用內存(〜40mb)。

我想知道是否有人能夠解釋MProtect和這個失敗,因爲我認爲我沒有正確理解它。

+0

完全相同的問題在這裏:http://stackoverflow.com/questions/5808833/exception-when-webservice-is-called-after-device-got-locked 你接受了一個答案,但我無法真正發現答案是什麼......!? – Krumelur 2011-04-27 18:34:51

+0

我接受這個答案的原因是因爲它回答了我解釋MProtect是什麼的問題。雖然它沒有直接回答我的問題特有的問題,但它確實給了我一些關於如何解決這個問題的想法。 – Luke 2011-04-28 07:57:04

+0

僅供參考,請參閱http://stackoverflow.com/questions/5819700/爲您的問題的根本原因的可能解決方案。 – mj2008 2011-05-02 08:11:07

回答

1

mprotect(2)要求操作系統內核更改某些地址空間部分的保護模式。

mprotect(2)常被用來使地址空間非可執行的數據部分,從而使buffer overflowsformat string vulnerabilitiesuse after freefreeing unallocated memory錯誤,或類似的攻擊不能返回到攻擊者提供的數據。此外,mprotect(2)用於確保程序text的空間不能被這些相同的漏洞修改。 (如果攻擊者可以簡單地覆蓋你提供的功能,那就不好了。)

但是mprotect(2)不是魔法;它不能阻止針對return to libc攻擊,或使用不當的system(3)或其他代碼翻譯等

什麼是iPhone上的errno12的C符號? Monotouch在哪裏以及爲什麼使用mprotect(2)本身?任何你的軟件使用mprotect(2)的機會?

+0

我不確定如何獲得'errno 12'的C符號(對不起)。我可以肯定地說,我們的應用程序不會明確地調用mprotect(2)。我不確定Monotouch爲什麼使用「mprotect(2)」,而且我也找不到太多東西。我看到有人建議製作更少的單色物體......它可能與蹦牀無關嗎?我設置了一個編譯器arg來將類型2的蹦牀增加到2048 – Luke 2011-03-23 10:52:54

+0

@Luke,我想你已經擊中了它! :)編譯器(鏈接器?)將需要使用'mprotect(2)'來更改頁面保護,以允許執行存儲蹦牀的頁面。我不知道該怎麼做,但我認爲你已經找到了原因。 :)要查找'errno 12'的文本描述,可以運行'printf(「%s \ n」,strerror(12));' – sarnold 2011-03-23 10:59:31

1

您的應用程序是否使用泛型?

小心使用泛型類型的虛擬方法,對於Monotouch而言,Monotouch在預先拼接時需要做大量的黑客工作,而使用蹦牀時需要更多的魔法,這會對我的體驗造成某種方法劫持或內存損壞,因人而異。

爲了安全起見,在通用類上使所有方法都是非虛擬的。

+0

謝謝您的建議。該應用程序確實使用泛型,我們有一個充滿虛擬泛型的類。我將其換掉,因此我們不再使用這種泛型,但問題仍然存在。 – Luke 2011-03-24 09:51:48

相關問題