在VS2010调试器中没有调用堆栈

5
我有一个加载DLL的应用程序,但随后崩溃了。我修改了IDE的工作目录,将其设置为解决方案构建目录,以便我可以对从此解决方案中的另一个项目构建的DLL运行调试器。当应用程序收到访问冲突时,我可以看到当前函数,但无法看到调用堆栈,也无法计算任何本地变量。我已经检查过该目录中是否存在调试器符号,并且它全部是在调试模式下构建的。调试器失败的原因是什么?
编辑:如果我放置断点,那么调试器就可以正常工作-尽管这当然不能告诉我应用程序为什么会崩溃,但我确实得到了调用堆栈,并且所有符号都可以愉快地计算。

这是“显示外部代码”设置吗?链接 - DOK
我发现了这个链接:这里。你可能会在那里得到一些其他的想法。 - DOK
1
你能将调试选项设置为在所有第一次机会异常时中断吗? - Chris O
你是否也在加载 Windows 符号文件?这样会使调用堆栈的评估更准确。 - Chris O
根本没有调用堆栈吗?还是有一堆机器地址之类的调用堆栈? - John Dibling
显示剩余4条评论
1个回答

4

当调试器遇到断点时正常工作,但在本地代码中发生访问冲突后打断点会失败,通常表示访问违规之前或同时存在堆栈损坏。

调试器依赖于堆栈中某些值的正确设置,以便构建正确的堆栈视图并访问本地变量。如果这些数据被破坏,将阻止显示本地变量和生成准确的堆栈图像。

如果在访问违规之前就遇到了断点,则堆栈仍然完整,调试器可以自由查看信息。


有趣的理论。现在我只需要找出为什么我会在一个完美的函数调用上抛出访问冲突并且炸掉我的堆栈。 - Puppy
好的。我找到了实际问题的原因(在尝试调用从DLL中获取的函数之前,我调用了FreeLibrary()),但仍然不明白为什么会导致调试器崩溃。 - Puppy
1
在你调用FreeLibrary的那一刻,函数指针本质上指向了随机存储器,然后你将其作为函数调用。这很可能导致了堆栈的损坏。 - JaredPar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接