【发布时间】:2018-01-24 17:15:20
【问题描述】:
我有一个大型、复杂的 C# GUI 应用程序,它以完全可重现的方式崩溃,但我无法轻松诊断崩溃的原因,因为不是以通常的方式使用调用堆栈破坏调试器,而是完全调试会话退出。
唯一的提示是输出窗口末尾有一条消息:STATUS_STACK_BUFFER_OVERRUN。
我煞费苦心地尝试在崩溃发生之前将断点放置在随机位置,试图逐渐让我的断点更接近问题发生的地方,但这种方法并没有让我快速到达任何地方。
我想知道是否有任何现有的工具可以像检测分析器一样工作,基本上观察和记录所有函数的进入和退出,这样当程序因堆栈损坏而崩溃时,仍然可以检查这个外部数据来确定上次执行的位置?
我不认为这是大多数面向性能的分析器都有的功能,因为他们更关心一个函数被调用了多少次以及调用了多长时间,但也许有一个工具可以准确地告诉我什么最后一个已知的运行代码是?
如果有办法在 Visual Studio 中解决/诊断此问题或使用其他技术,我愿意接受其他建议。
【问题讨论】:
-
作为事后分析,我没有找到任何符合要求的工具,所以我用艰难的方式解决了这个问题——大量的猜测、二次猜测、打印语句和断点来找出在哪里它失败了。在我的情况下,原因是堆栈分配的缓冲区(本地声明的 4x4 矩阵数组)不够大,并且代码写入超出了缓冲区的末尾并破坏了堆栈的其余部分。
标签: c# visual-studio crash profiler