我有一個64位程序,它可以與VirtualBox COM接口一起使用並實現虛擬機的前端。最近我開始變得很奇怪,我至少想明白這個原因。據我瞭解堆棧需要16byte對齊,所以我認爲未對齊的堆棧指針可能會導致此問題。但事情是,因爲我所有的程序都是使用來自ATL的STDMETHOD
宏來實現一些COM接口,它應該使用正確的調用約定,那麼我怎樣才能把這個堆棧搞亂呢?展開操作期間遇到無效或未對齊的堆棧
這裏是調用堆棧的一個例子,當出現問題:
ntdll.dll!00007ffe679ac0b4() Unknown
ntdll.dll!00007ffe67913356() Unknown
msvcrt.dll!__longjmp_internal() Unknown
> VBoxREM.dll!000000006fb0f3c4() Unknown
我試圖古爾的__longjmp_internal
符號,但沒有發現任何有用的東西 - 它表明例外的展開是在進步嗎?
對如何處理這個問題的調試或者評論什麼事情搞砸棧對齊的歡迎,因爲據我所知,在這種情況下,這將是不可能的,因爲VirtualBox是涉及給出一個確切的解決方案的任何指針。
我不禁大爲,但這是[longjmp的(http://www.cplusplus.com/reference/csetjmp/longjmp/) – ChrisWard1000 2014-10-28 09:46:32
無效比非對齊更有可能。你有沒有證實對齊是問題還是隻是猜測?破壞堆棧的方法比世界上的程序員還要多。懸掛或未初始化的指針和緩衝區溢出可能是最常見的。你犯了哪一個是無法猜測的。 – molbdnilo 2014-10-28 10:00:33
@molbdnilo我猜測,因爲我期望得到訪問衝突或類似的東西,如果我有一個懸掛的指針或做了內存溢出,但我當然不能排除這些。猜猜我必須做一些內存分析。 – 2014-10-28 10:06:38