gpt4 book ai didi

c++ - 堆栈溢出后调用 SymSetOptions 时出现 AccessViolation

转载 作者:行者123 更新时间:2023-11-28 02:05:51 24 4
gpt4 key购买 nike

我目前正在研究一种解决方案,使错误更易于调试。

所以我有一个已经定义好的 main 并且用户需要定义 wrappermain 来代替 main 的使用:

int main(int ac, char** av)
{
__try {
return wrappermain(ac, av);
} __except(HandleException(GetExceptionCode(), GetExceptionInformation()) {
return 1;
}
}

现在在 HandleException 函数中我加载符号信息并设置一些选项:

if (!SymInitialize(process, symSearchPath, false))
return;

DWORD symOptions = SymGetOptions();
symOptions |= SYMOPT_LOAD_LINES | SYMOPT_UNDNAME;
SymSetOptions(symOptions);

这个构造就像一个魅力,但是当我用无休止的递归引起堆栈溢出时,我在调用 SymSetOptions(symOptions)

时遇到访问冲突

那会是什么以及如何摆脱崩溃?

最佳答案

这里的核心问题显然是堆栈。你有一个堆栈溢出(损坏/不可用),你想用一个基于堆栈的异常处理程序来处理它。那不会很好地工作。我什至对你能走到这一步感到惊讶;您的异常处理程序必须通过返回调用堆栈以找到处理程序来找到。如果出现溢出并且部分堆栈在操作中丢失,那么遍历堆栈将成为一个问题。

无论如何,我怀疑直接原因是堆栈上缺少保护页。堆栈未预先完全分配。相反,在分配的末尾有一个保护页。推送太多会导致页面错误,这通常会导致成功的堆栈增长。但是当没有剩余空间时,溢出是致命的,保护页面消失了。

解决方法很可能是使用另一个 线程。它会轮询一个全局标志(DWORD so atomic)并在没有任何反应时休眠。您的异常处理程序只需要设置标志,不需要工作堆栈。这将解锁辅助线程,辅助线程随后(使用其新堆栈)调用相关方法。

vector 异常处理看起来像是一种解决方法,但它对您在处理程序中可以执行的操作有严格的限制。

关于c++ - 堆栈溢出后调用 SymSetOptions 时出现 AccessViolation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37567772/

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