Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当调试器在没有调用堆栈的情况下退出时跟踪C#崩溃的工具?_C#_Visual Studio_Crash_Profiler - Fatal编程技术网

当调试器在没有调用堆栈的情况下退出时跟踪C#崩溃的工具?

当调试器在没有调用堆栈的情况下退出时跟踪C#崩溃的工具?,c#,visual-studio,crash,profiler,C#,Visual Studio,Crash,Profiler,我有一个大型、复杂的C#GUI应用程序,它正在以完全可复制的方式崩溃,但我无法轻松诊断崩溃的原因,因为调试会话完全退出,而不是以通常的方式用调用堆栈破坏调试器 唯一的提示是在输出窗口的末尾有一条消息:STATUS\u STACK\u BUFFER\u overflow 在崩溃发生之前,我一直在努力将断点放在随机的地方,试图让断点逐渐靠近问题发生的地方,但这种方法并不能很快让我到达任何地方 我想知道是否有任何现有的工具可以像检测分析器一样工作,基本上观察并记录所有函数的进入和退出,这样当程序因堆栈

我有一个大型、复杂的C#GUI应用程序,它正在以完全可复制的方式崩溃,但我无法轻松诊断崩溃的原因,因为调试会话完全退出,而不是以通常的方式用调用堆栈破坏调试器

唯一的提示是在输出窗口的末尾有一条消息:STATUS\u STACK\u BUFFER\u overflow

在崩溃发生之前,我一直在努力将断点放在随机的地方,试图让断点逐渐靠近问题发生的地方,但这种方法并不能很快让我到达任何地方

我想知道是否有任何现有的工具可以像检测分析器一样工作,基本上观察并记录所有函数的进入和退出,这样当程序因堆栈损坏而崩溃时,仍然可以检查这些外部数据以确定上次执行的位置

我不认为这是大多数面向性能的探查器所具有的特性,因为他们更关心函数被调用的次数和调用的时间,但也许有一种工具可以准确地告诉我最后一段已知的运行代码是什么

如果在Visual Studio中或使用其他技术可以解决/诊断此问题,我愿意接受其他建议。

您可以使用触发:

这里的诀窍是知道断点放在哪里,因为它必须在递归循环中的某个地方设置。但是,如果你知道是什么触发了错误,你可能会有足够的直觉来选择一些有战略意义的地方进行检查。您还可以使用消除过程:如果未触发断点,则知道循环中不涉及代码

还请注意,条件断点代价高昂,并且会显著降低正在调试的应用程序的速度。如果您不反对在代码中乱放调试语句,可以使用以下方法代替设置断点:

if (Debugger.IsAttached && (new StackTrace()).GetFrames().Length > 60)
    Debugger.Break();

STATUS_STACK_BUFFER_overflow表示有人传递了堆栈变量的结尾或开头,很可能是在非托管或互操作代码中


如果在本机模式或混合模式下附加调试器,请转到“异常”窗口并添加代码为0xc0000409(堆栈溢出)的Win32异常。如果触发错误,它将在调试器中中断。

您可以使用我的工具记录应用程序中的所有函数调用。崩溃后,您可以看到最后一个函数enter是什么。

尽管堆栈缓冲区溢出错误听起来像是失控递归造成的,但我不确定是否会发生类似的情况。(通常,当您通过多次递归破坏堆栈时,仍然可以在Visual Studio中看到调用堆栈)。看起来更像是一些随机的代码片段出现并破坏了堆栈,而不一定是深度调用堆栈。@uglycoyote除非您在同一进程中运行一些非托管代码,否则您不应该遭受堆栈/堆损坏。并不是说它不可能发生,但托管环境对这种事情非常强大。啊,是的,很高兴你能指出这一点。事实上,出现问题的是非托管代码。也许我应该在问题描述中说明这一点。这是一个C++的图形用户界面,使用了一些C++和CLI和非托管C++在引擎盖上做3D动画。作为验尸,我没有找到任何适合这个帐单的工具,所以我用很难的方式解决了这个问题——大量的猜测、猜测、打印语句和断点来找出它在哪里失败。在我的例子中,原因是堆栈分配的缓冲区(本地声明的4x4矩阵数组)不够大,代码写入的时间超过了缓冲区的末尾,破坏了堆栈的其余部分。
if (Debugger.IsAttached && (new StackTrace()).GetFrames().Length > 60)
    Debugger.Break();