gpt4 book ai didi

c# - 代码中的访问冲突不是我的

转载 作者:IT王子 更新时间:2023-10-29 04:28:05 28 4
gpt4 key购买 nike

我不确定如何调试它。我有一个完全由托管代码组成的 C# 程序,在 .NET 4.5 中运行。运行一段时间后,在某个看似随机的时间,我收到一条错误消息“mscorlib.dll 中出现类型为‘System.AccessViolationException’的未处理异常”。由于我是从 Visual Studio (2012) 运行它的,因此我单击“中断”并看到以下调用堆栈:

mscorlib.dll!System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint errorCode, uint numBytes, System.Threading.NativeOverlapped* pOVERLAP) + 0x47 bytes    
[Native to Managed Transition]
ntdll.dll!_NtRequestWaitReplyPort@12() + 0xc bytes
kernel32.dll!_ConsoleClientCallServer@16() + 0x4f bytes
kernel32.dll!_GetConsoleLangId@4() + 0x2b bytes
kernel32.dll!_SetTEBLangID@0() + 0xf bytes
KernelBase.dll!_GetModuleHandleForUnicodeString@4() + 0x22 bytes
mdnsNSP.dll!7177aa48()
[Frames below may be incorrect and/or missing, no symbols loaded for mdnsNSP.dll]
mdnsNSP.dll!71775b06()
mdnsNSP.dll!71774ded()
mdnsNSP.dll!71774e8c()
bcryptprimitives.dll!746d1159()
bcryptprimitives.dll!746d1137()
ntdll.dll!_LdrpCallInitRoutine@16() + 0x14 bytes
ntdll.dll!_NtTestAlert@0() + 0xc bytes
ntdll.dll!_NtContinue@8() + 0xc bytes
ntdll.dll!_LdrInitializeThunk@8() + 0x1a bytes

我注意到的一件有趣的事是,调用堆栈中没有任何内容是我的代码。

您建议我使用什么策略来找到问题的路径?或者您是否遇到过类似的问题并有任何提示?

由于异常似乎不包括我的代码,我不知道要包括哪些信息有助于回答问题,但请问我是否还有其他我应该包括的信息。

由于错误可能与 IO 相关(因为 PerformIOCompletionCallback 位于堆栈的顶部),这是此应用程序执行的典型 IO 任务的列表:

  • TcpListener.AcceptTcpClientAsync
  • NetworkStream.Write/BeginRead/EndRead
  • SqlCommand.BeginExecuteReader/EndExecuteReader
  • StreamWriter.WriteLine

其他说明:

  • 这似乎是大致可重复的 - 我在同一个地方 (PerformIOCompletionCallback) 得到了同样的错误,但必须等待不同的时间长度才能得到它(以分钟为单位)。
  • 我不认为我可以制作一个能够可靠地突出问题的小程序。我的程序在遇到此错误之前处理了数千个类似的 IO 操作。

编辑:

根据@Kevin 的建议,Mdnsnsp.dll 来自 Bonjour,我卸载了 Bonjour 并再次尝试。异常仍然存在,但调用堆栈更清晰:

mscorlib.dll!System.Threading._IOCompletionCallback.PerformIOCompletionCallback(uint errorCode, uint numBytes, System.Threading.NativeOverlapped* pOVERLAP) + 0x47 bytes    
[Native to Managed Transition]
kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes

我假设 Bonjour 安装程序为网络流量安装了一些良性 Hook DLL,但卸载它并没有解决问题。

编辑:

我已经使用较慢的“安全”等价物暂时重新编码了我所有的 unsafe 函数,以将其排除在外。现在应用程序中的程序集都不是使用不安全开关编译的。问题仍然存在。重申一下,我现在在此应用程序中没有不安全代码、 native 代码和 P/Invoke 调用(在用户代码中),但我仍然遇到如上所述的 AccessViolationException

最佳答案

由于它的 PerformIOCompletionCallback 导致错误,我会查看您的异步 IO 调用。

  • TcpListener.AcceptTcpClientAsync
  • NetworkStream.Write/BeginRead/EndRead
  • SqlCommand.BeginExecuteReader/EndExecuteReader

错误看起来是因为注册的句柄不再有效。由于它发生在托管代码中,原因将来自托管对象而不是来自第 3 方 native DLL。

关于c# - 代码中的访问冲突不是我的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14386301/

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