【问题标题】:Determine reason of System.AccessViolationException确定 System.AccessViolationException 的原因
【发布时间】:2009-07-01 14:52:46
【问题描述】:

我们从本机代码中抛出了不确定的 System.AccessViolationException。很难重现它,但有时它会发生。我不确定我是否可以“只调试它”,因为访问冲突所需的时间大约是 2 小时,并且不能保证会发生访问冲突。

本机库由托管包装器使用。它通过 JNI 从 java 使用,并通过 IKVM 的 JNI 从 .NET 使用。该问题仅在 IKVM 的代码中重现,但数据集不同,无法使用 IKVM 应用程序使用的数据测试 java 应用程序。

我有所有内容的来源,但(如果可能)我想避免进行大量更改。

我相信本机调用堆栈将提供有关此访问冲突原因的足够信息。

是否有任何有效的方法来确定这种访问违规的原因?

我认为对我来说理想的解决方案是对代码或流程环境进行一些更改,因此如果发生这种访问冲突,它会因内存转储而崩溃,因此我可以进行更改并等待。

【问题讨论】:

    标签: .net debugging access-violation


    【解决方案1】:

    如果您有能力等待异常发生,请附加托管调试器和本机调试器(混合调试会话),并将托管调试器设置为在抛出 AccessViolationException 时中断。托管调试器将在检测到未处理的异常时中断进程,然后您应该能够看到本机调用堆栈。

    【讨论】:

    • 嗯.. 我更改了我的本机代码,因此它肯定存在访问冲突并使用调试符号重新编译它。当我正常启动该过程并附加 Visual Studio 调试器时。我添加了一个用于抛出 AccessViolationException 的断点,但它没有被捕获。有什么建议吗?
    • 好的,我发现断点应该是Win32访问冲突。
    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    相关资源
    最近更新 更多