微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试从内存位置 0x00000000

如何解决尝试从内存位置 0x00000000

我有一个应用程序(我们的应用程序)多线程,有时会崩溃,没有异常(我们订阅了 UnhandledException)。两次崩溃之间可能有几天或几个月的时间。所有线程都是手动创建的,我们不使用线程池。

我知道非托管内存有问题,但在我的应用程序中,我们没有非托管函数(没有 importdll),但我们使用了一个 lib MIL(用于图像处理的库),它在我们的应用程序中使用了一些 IntPtr。

我有崩溃的转储,但并不总是很容易找到

这是崩溃线程的结果(来自 DebugDiag):

Entry point   clr!:: 
Create time   16/11/2020 18:12:39 
Time spent in user mode   0 Days 00:03:55.515 
Time spent in kernel mode   0 Days 00:00:03.625 

Call Stack

clr!SVR::gc_heap::mark_object_simple+91    
clr!SVR::gc_heap::mark_through_cards_for_segments+482    
clr!SVR::gc_heap::mark_phase+302    
clr!SVR::gc_heap::gc1+b1    
clr!SVR::gc_heap::garbage_collect+f0    
clr!SVR::gc_heap::gc_thread_function+74    
clr!SVR::gc_heap::gc_thread_stub+9a    
clr!<lambda_984b1062d0d4b010966442b24889003f>::<lambda_invoker_cdecl>+51    
kernel32!BaseThreadInitThunk+22    
ntdll!RtlUserThreadStart+34

这是第二个出错的线程(来自 DebugDiag): 错误是:在 App.exe.6860.dmp 中,GC 正在此进程中运行。触发GC的线程是1502 我重命名了应用程序,不是 App.exe :D

Entry point   clr!Thread::intermediateThreadProc 
Create time   16/11/2020 18:13:27 
Time spent in user mode   0 Days 21:36:08.437 
Time spent in kernel mode   0 Days 01:01:11.015 

.NET Call Stack

[[HelperMethodFrame]] 
Matrox.MatroxImagingLibrary.MIL_INTArrayToIntArrayConverter..ctor(Matrox.MatroxImagingLibrary.MIL_INT[])+2d 
Matrox.MatroxImagingLibrary.MIL.MimGetResult(Matrox.MatroxImagingLibrary.MIL_ID,Int64,Matrox.MatroxImagingLibrary.MIL_INT[])+2e 
App.VisionEngine.DetectionPresence()+373 
App.VisionEngine.th_ActivationP_Processus()+b19 
App.ClassVisionEngine.b__238_0()+25 
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,Boolean)+172 
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,Boolean)+15 
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Object)+55 
mscorlib_ni!System.Threading.ThreadHelper.ThreadStart()+55 
[[GCFrame]] 
[[DebuggerU2MCatchHandlerFrame]] 

来源

ntdll!NtWaitForSingleObject+a    
KERNELBASE!WaitForSingleObjectEx+94    
clr!CLREventWaitHelper2+3c    
clr!CLREventWaitHelper+1f    
clr!CLREventBase::WaitEx+71    
clr!SVR::gc_heap::wait_for_gc_done+5a    
clr!SVR::GCHeap::GarbageCollectGeneration+ed    
clr!SVR::gc_heap::trigger_gc_for_alloc+34    
clr!SVR::GCHeap::Alloc+225    
clr!JIT_NewArr1+6dd    
Matrox.MatroxImagingLibrary.MIL_INTArrayToIntArrayConverter..ctor(Matrox.MatroxImagingLibrary.MIL_INT[])+2d    
Matrox.MatroxImagingLibrary.MIL.MimGetResult(Matrox.MatroxImagingLibrary.MIL_ID,Matrox.MatroxImagingLibrary.MIL_INT[])+2e    
App.VisionEngine.DetectionPresence()+373    
App.VisionEngine.th_ActivationP_Processus()+b19    
App.VisionEngine.<Start>b__238_0()+25    
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext,Boolean)+172    
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,Boolean)+15    
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Object)+55    
mscorlib_ni!System.Threading.ThreadHelper.ThreadStart()+55    
clr!CallDescrWorkerInternal+83    
clr!CallDescrWorkerWithHandler+4e    
clr!MethodDescCallSite::CallTargetWorker+102    
clr!ThreadNative::KickOffThread_Worker+fffff02f    
clr!ManagedThreadBase_dispatchInner+40    
clr!ManagedThreadBase_dispatchMiddle+6c    
clr!ManagedThreadBase_dispatchOuter+4c    
clr!ManagedThreadBase_FullTransitionWithAD+2f    
clr!ThreadNative::KickOffThread+e6    
clr!Thread::intermediateThreadProc+8b    
kernel32!BaseThreadInitThunk+22    
ntdll!RtlUserThreadStart+34 

Matrox 来自 MIL.lib

我被这个崩溃卡住了,有人可以给我一些建议

谢谢

解决方法

“在我们的应用程序中使用了一些 IntPtr。”假设它是您的应用程序而不是库(并且这个假设并非完全可疑),请检查您将 IntPtr 传递给库的任何地方是否存在 NULL。尽管使用 C# 编写,但您现在正在遵守非托管规则。

特定的堆垃圾也暗示了将数组传递给保留数组的本机函数的可能性,并且您没有先使用 GCHandle 固定数组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。