gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:56:54 25 4
gpt4 key购买 nike

我有一个大型、复杂的 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/

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