非常簡單地說,如果一個C++程序執行以下函數(比如在Windows 7上,使用任何VS版本進行編譯),然後崩潰,然後您使用WER附加調試器,或者WER生成崩潰轉儲並稍後分析崩潰轉儲。是否可以直接識別覆蓋整個堆棧的錯誤代碼?
是從垃圾堆裏的信息有可能,以直接推斷,這個功能被執行,也就是找到屬於那個執行它,這個函數在執行線程痕跡。
或者當我損壞整個堆棧時,所有的執行軌跡都消失了嗎?
void bye_bye_stack() {
int local = 42;
int* stackaddr = &local;
while(time(NULL) != NULL) { // prevent optimizations via call to time()
++stackaddr; // stack grows towards smaller addresses, so increasing the pointer will point to info we already put on the stack
*stackaddr = local; // destroy stack content
// program will (likely) crash here once we reach a read-only page
}
}
使用valgrind? (填充物) – 2013-01-18 14:12:35
不,這是極端的痛苦。 EIP和EBP是垃圾,ESP指向爆炸的堆棧幀,許多可能已經丟失。你所能做的就是回去嘗試找到一個沒有踩踏的返回地址。這仍然只給你一小部分調用堆棧。接下來您考慮使用安全的CRT功能。 –