非常简单地说,如果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
}
}
答案 0 :(得分:1)
答案 1 :(得分:1)
一般来说,通过以你的方式破坏堆栈,你将破坏'callstack',这意味着有关先前调用的例程的信息将会消失。但是,如果从此例程中触发访问冲突/分段错误,则会存储指向此事件的指令指针。
但是,如果堆栈已损坏并且您从此例程返回,那么要弄清楚发生了什么将是非常困难的,如果不是不可能的话。
如果您想弄清楚发生了什么,我建议使用调试工具找出堆栈被“粉碎”的位置。如果您的目的是销毁执行证据,请确保您从此例程中“跳”或“返回”,而不会触发异常。
答案 2 :(得分:-1)
这取决于。崩溃转储中提供的Backraces直接依赖于堆栈中存储的信息。这通常意味着当您怀疑堆栈损坏时,您无法信任回溯。
您提供的功能很可能会损坏整个堆栈,然后在超出段限制或达到进程无法使用的内存时导致异常。此时堆栈中没有任何东西可以指示嫌疑人。