是否有可能直接识别覆盖整个堆栈的错误代码?

时间:2013-01-18 14:10:25

标签: c++ windows debugging visual-c++ stack-corruption

非常简单地说,如果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
  }
}

3 个答案:

答案 0 :(得分:1)

这不是对您问题的直接回复。

然而,当我遇到堆栈被覆盖时,我曾经启动实用程序gflags,当开始覆盖堆栈时,它会立即断言。

Gflags is provided by Microsoft

答案 1 :(得分:1)

一般来说,通过以你的方式破坏堆栈,你将破坏'callstack',这意味着有关先前调用的例程的信息将会消失。但是,如果从此例程中触发访问冲突/分段错误,则会存储指向此事件的指令指针。

但是,如果堆栈已损坏并且您从此例程返回,那么要弄清楚发生了什么将是非常困难的,如果不是不可能的话。

如果您想弄清楚发生了什么,我建议使用调试工具找出堆栈被“粉碎”的位置。如果您的目的是销毁执行证据,请确保您从此例程中“跳”或“返回”,而不会触发异常。

答案 2 :(得分:-1)

这取决于。崩溃转储中提供的Backraces直接依赖于堆栈中存储的信息。这通常意味着当您怀疑堆栈损坏时,您无法信任回溯。

您提供的功能很可能会损坏整个堆栈,然后在超出段限制或达到进程无法使用的内存时导致异常。此时堆栈中没有任何东西可以指示嫌疑人。