c# - 当调试器退出且没有调用堆栈时,用于跟踪 C# 崩溃的工具?

标签 c# visual-studio crash profiler

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

唯一的提示是输出窗口末尾有一条消息:STATUS_STACK_BUFFER_OVERRUN。

在崩溃发生之前,我煞费苦心地尝试在随机位置放置断点,试图逐渐让我的断点更接近问题发生的位置,但这种方法并不能很快让我到达任何地方。

我想知道是否有任何现有工具的工作方式类似于仪器分析器,基本上观察和记录所有函数的进入和退出,以便当程序因堆栈损坏而崩溃时,仍然可以检查这个外部数据来确定最后一次执行的位置?

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

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

最佳答案

您可以使用 conditional breakpoint触发when the stack depth exceeds a certain value :

(new StackTrace()).GetFrames().Length > 60

这里的技巧是知道在哪里放置断点,因为它必须设置在递归循环中的某个位置。但是,如果您知道触发错误的原因,您可能有足够的直觉来选择一些策略性的位置来进行检查。您还可以使用排除法:如果没有触发断点,就知道代码没有参与循环。

另请注意,条件断点的成本很高,并且会显着减慢正在调试的应用程序的速度。如果您不反对在代码中乱扔调试语句,您可以 call Debugger.Break()而不是设置断点:

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

关于c# - 当调试器退出且没有调用堆栈时,用于跟踪 C# 崩溃的工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48428147/

相关文章:

visual-studio - 从 VS2010 扩展中获取当前解决方案中程序集的类型信息

java - Android-当我尝试在文本框中显示某些内容时崩溃

c# - 业务对象和数据层

c# - XElement Nodes() 与 Elements() 有什么区别?

c# - 从 XAML 开始 VisualState 转换

c# 获取带有 "#"的完整 URL

c++ - 警告 MSB8012 - 在 Visual Studio 2015 上构建 Visual Studio 2003 项目

asp.net - Visual Studio 22 构建时间慢

ios - 从 NSDataAsset 读取时偶尔崩溃

ios - 为什么我的应用程序会在一夜之间关闭?