代码之家  ›  专栏  ›  技术社区  ›  Charles

在Windows堆栈跟踪中,“unload”前缀是什么意思?

  •  2
  • Charles  · 技术社区  · 16 年前

    我有一个可怕的问题,第三方DLL在卸载时会导致递归堆栈溢出崩溃。我在堆栈上结束了这个模式(使用windbg):

    <Unloaded_ThirdParty.dll>+0xdd01
    ntdll!ExecuteHandler2+0x26
    ntdll!ExecuteHandler+0x24
    ntdll!KiUserExceptionDispatcher+0xf
    <Unloaded_ThirdParty.dll>+0xdd01
    ntdll!ExecuteHandler2+0x26
    ntdll!ExecuteHandler+0x24
    ntdll!KiUserExceptionDispatcher+0xf
    ...
    

    如你所料,我没有ThirdParty.dll的源代码。

    问:堆栈转储中前缀“Unloaded”是什么意思。我以前从没见过这个。

    2 回复  |  直到 9 年前
        1
  •  8
  •   JSBÕ±Õ¸Õ£Õ¹    16 年前

    这意味着 ThirdParty.dll 不再被引用,并且在崩溃发生时已从内存中删除。要找出实际的堆栈跟踪,需要使用以下命令在内存中的原始位置重新加载.dll:

    .reload /f ThirdParty.dll=0xaaaaaaaa
    

    你当然要换了 0xaaaaaaaa 使用模块的原始基址。如果模块已经被卸载,这可能有点困难,但是如果您有一个 HMODULE 到处都是指dll,它的值 是基址。最坏的情况是,您可以将调试器跟踪语句添加到记录 H模块 在卸载dll之前。

        2
  •  1
  •   the_mandrill    16 年前

    我以前也遇到过这样的崩溃,正如JS指出的,这意味着dll在崩溃之前已经被卸载了。但是,将堆栈跟踪放入该dll不一定能提供诊断问题所需的信息。

    代码中的某些内容正在卸载库,因为它认为它已经完成了,但在某个地方仍然有指向它(或指向其中的函数)的指针。我猜是一个回调,也许是来自另一个线程。我建议你查一下你的电话号码 FreeLibrary() 同时在 FreeLibrary

    Process Monitor