首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MiniDumpWriteDump()挂起

MiniDumpWriteDump()挂起
EN

Stack Overflow用户
提问于 2020-06-29 07:07:16
回答 1查看 680关注 0票数 2

如果堆分配/脱分配/重新分配正在另一个线程中进行,则DbgHelp库的DbgHelp()挂起。下面是调用堆栈: DbgHelp暂停其他线程,然后无限期地等待这些线程获得的互斥。

代码语言:javascript
复制
    ntdll.dll!NtWaitForAlertByThreadId()   Unknown
    ntdll.dll!RtlpWaitOnAddressWithTimeout()    Unknown
    ntdll.dll!RtlpWaitOnAddress()   Unknown
    ntdll.dll!RtlpWaitOnCriticalSection()   Unknown
    ntdll.dll!RtlpEnterCriticalSectionContended()  Unknown
    ntdll.dll!RtlEnterCriticalSection()    Unknown
    ntdll.dll!RtlpReAllocateHeap()  Unknown
    ntdll.dll!RtlpReAllocateHeapInternal()  Unknown
    ntdll.dll!RtlReAllocateHeap()   Unknown
    ntdll.dll!LdrpSetAlternateResourceModuleHandle()    Unknown
    ntdll.dll!LdrResGetRCConfig()   Unknown
    ntdll.dll!LdrpResSearchResourceMappedFile() Unknown
    ntdll.dll!LdrResSearchResource()    Unknown
    KernelBase.dll!FindVersionResourceSafe()   Unknown
>   KernelBase.dll!GetFileVersionInfoSizeExW()  Unknown
    dbgcore.dll!Win32LiveSystemProvider::GetImageVersionInfo(void *,unsigned short const *,unsigned __int64,struct tagVS_FIXEDFILEINFO *)   Unknown
    dbgcore.dll!GenAllocateModuleObject(struct _MINIDUMP_STATE *,struct _INTERNAL_PROCESS *,unsigned short *,unsigned __int64,unsigned long,struct _INTERNAL_MODULE * *)    Unknown
    dbgcore.dll!GenGetProcessInfo(unsigned long,struct _MINIDUMP_STATE *,struct _INTERNAL_PROCESS * *,struct _LIST_ENTRY *) Unknown
    dbgcore.dll!MiniDumpProvideDump()  Unknown
    dbgcore.dll!MiniDumpWriteDump()    Unknown

你知道在这种情况下有一个简单的解决办法吗?我可以看到向应用程序中的所有其他线程注入检查的解决方案,以查看是否请求核心转储,然后在不获取互斥项的地方暂停。但是,这是一个很大的变化,加上应用程序的一些线程超出了我的控制范围,因为它们是由我用于内部使用的库启动的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-29 07:27:46

一般说来,MiniDumpWriteDump执行两个操作:

  1. 挂起目标进程中的所有线程。
  2. 完成后,转储目标进程的状态。

第一步挂起每个线程,不管它当前在做什么。如果它碰巧拥有对共享资源的独占访问,它将无限期地保留它。正如记录的那样,只有一种单一的可靠的方法来调用MiniDumpWriteDump

如果可能的话,MiniDumpWriteDump应该从单独的进程中调用,而不是从正在转储的目标进程中调用。当目标进程已经不稳定时,尤其如此。例如,如果它刚刚坠毁。加载器死锁是从目标进程中调用MiniDumpWriteDump的许多潜在副作用之一。

文档没有列出此API可能导致死锁的所有可能方式。在您的示例中,您似乎挂起了一个处于从堆中分配内存的线程。默认情况下,堆是同步的。随着MiniDumpWriteDump的进行,它还会尝试分配堆内存。为此,它请求堆同步对象。但是它从未被释放,因为它只是暂停线程以保持对它的独占访问。

同样,这只是API可以死锁的一种方式,当从它被指示转储的同一进程中调用时。有很多其他的机会来实现这一点。

解决方案:将其置于外部过程中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62632898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档