gpt4 book ai didi

c++ - 是否可以直接识别覆盖整个堆栈的错误代码?

转载 作者:可可西里 更新时间:2023-11-01 10:37:59 25 4
gpt4 key购买 nike

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

最佳答案

一般来说,按照您的方式销毁堆栈,您将销毁“调用堆栈”,这意味着有关先前调用的例程的信息将会消失。但是,如果您从此例程中触发访问冲突/段错误,则会存储发生这种情况的指令指针,指向此例程。

但是,如果堆栈已损坏并且您从该例程返回,将很难甚至不可能弄清楚发生了什么。

如果您想弄清楚发生了什么,我建议您使用调试工具找出堆栈在何处被“破坏”。如果您的意图是破坏执行的证据,请确保您从该例程中“跳转”或“返回”,而不会触发异常。

关于c++ - 是否可以直接识别覆盖整个堆栈的错误代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14400658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com