1

我有一个 Windows 多线程控制台应用程序,似乎每分钟左右泄漏大约 4kb 的私有内存。

为了定位泄漏,我逐渐暂停了应用程序中的每个线程,直到泄漏停止,令我惊讶的是,罪魁祸首似乎是一个名为“Win32Thread”的线程。

它看起来不像我明确启动的线程。

如果我附加并中断应用程序,堆栈跟踪如下所示:

    ntdll.dll!_KiFastSystemCallRet@0()  
    ntdll.dll!_NtCancelTimer@8()  + 0xc bytes   
    ntdll.dll!_RtlpResetTimer@12()  + 0x15 bytes    
>   ntdll.dll!_RtlpServiceTimer@12()  + 0xfd bytes  
    ntdll.dll!_KiUserApcDispatcher@16()  + 0x25 bytes   
    kernel32.dll!_BaseThreadStart@8()  + 0x34 bytes 

有谁知道为什么这会突然泄漏?

该应用程序在 Win2k3 SP2 双核系统上运行了大约 40 小时。

任何想法都将不胜感激。

4

2 回答 2

2

该堆栈跟踪看起来像是在与计时器相关的代码中。我猜您的代码(或您使用的库)通过 usingtimeSetEvent或类似的功能启动了一个计时器。在这种情况下,泄漏可能在您的计时器回调函数中。

启动多媒体计时器会导致创建一个线程,并且将从该线程调用您的回调。定期计时器可以解释为什么它在空闲时泄漏。

于 2010-02-05T12:33:51.127 回答
0

您的应用程序是否有任何 APC(异步过程调用)或计划的计时器事件?多媒体计时器回调会。

如果您的回调使用 C 运行时调用,这些调用会进行一次性线程本地分配(懒惰地,在第一次在线程中调用函数时分配)来完成它们的工作(_tcstol、sprintf 等)。因为线程不是使用 beginthread() 或 beginthreadex() 启动的,所以当线程死亡时,无法清理此内存,因此这将表现为泄漏。

于 2010-02-05T16:57:13.113 回答