问题标签 [handle-leak]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2819 浏览

c++ - GetGuiResources 的使用

GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS)在开始时WinMain和最后一次返回之前使用来检测 GDI 泄漏或者更具体地说,我忘记释放的对象是一个好主意吗?
另外我目前想知道为什么我的程序中的第一个调用在4还没有窗口时返回。

0 投票
4 回答
2415 浏览

c# - 从 System.Threading.Timer 在 UI 中调用时如何避免泄漏句柄?

似乎在 System.Threading.Timer 的回调中调用 Winforms 控件上的 Invoke 会泄漏句柄,直到释放计时器。有谁知道如何解决这个问题?我需要每秒轮询一个值并相应地更新 UI。

我在一个测试项目中进行了尝试,以确保这确实是导致泄漏的原因,如下所示:

如果您在 Windows 任务管理器中观看,这将泄漏 2 个句柄/秒。

0 投票
3 回答
3957 浏览

.net - 使用 .NET System.Threading.Thread 类处理泄漏

我有一个问题,我的应用程序中的句柄数量不断增长。我进行了调试并认识到这是由用于某些例程的 System.Threading.Thread 类引起的。为了简化调试,我创建了一个示例 .NET 应用程序:

每次单击按钮时,都会使用 System.Threading.Thread 类创建一个线程。问题是看起来线程没有释放句柄,因为每次点击都会导致句柄的数量增加约 5 个。

问题是:如何手动释放 System.Threading.Thread 类创建的所有句柄?

提前致谢。

0 投票
3 回答
2636 浏览

c# - 奇怪的手柄泄漏

我的应用程序(基本应用程序是 MFC 与 C++/CLI 互操作,但它也包含很多 C#、Windows 窗体、WPF)有句柄泄漏。应用程序启动后不久,我可以看到任务管理器中的句柄计数不断增长(以每秒 10 个新句柄的速度)。所以我用handles.exe来看看它们是什么类型的句柄。我发现泄漏的句柄是进程句柄。它们是我的应用程序进程的进程句柄。

所以我想知道哪些操作通常会为其运行的进程创建一个句柄。知道吗?你见过这样的事情吗?考虑到我不能使用调试 DLL 并且我只能使用可以 xcopy 部署的工具,我还能做些什么来追踪泄漏。

更新:

我能够向它抛出windbg!handle, !htrace并发现进程句柄都是使用以下堆栈跟踪创建的(按频率排序):

或者

或者

现在这告诉我什么?

0 投票
1 回答
1419 浏览

windbg - !htrace 显示没有调用堆栈

当我在 WinDbg 中使用!htrace -diff调试句柄泄漏时,我得到了很多不显示调用堆栈的句柄(可能是正在泄漏的句柄):

这可能是什么原因,我有哪些选项可以进一步调试?

更新:句柄泄漏似乎取决于图形驱动程序或图形卡。当我使用任何形式的 WPF 时,它就会开始泄漏,它只会在某些具有特定显卡/驱动程序的 Windows XP 系统上泄漏。

0 投票
1 回答
411 浏览

c# - AdsConnection 没有关闭?

考虑以下代码:

该方法是通用的,因为并非所有客户都有 Adavatage DB 服务器,我们需要回退到 OleDbConnection。然而,在大多数情况下,我们使用 AdsConnection 对象(来自 Advantage.Data.Provider.dll)。

上面的代码关闭连接,并且在退出 using 语句时对象被释放。

当我们使用 Advantage Management Utility 查看广告服务器上的所有连接时,我们注意到连接保持打开状态。但不是所有的!我们可能调用该方法 200 次,只有少数保持打开状态,有时超过客户端 MAX_CONNECTIONS。感谢Jens Mühlenhoff,我们可以解决这个问题。

问题是:

为什么调用 oConn.Close() 时连接没有关闭?有人有什么想法吗?

0 投票
1 回答
3411 浏览

c# - 在 WinDbg 中显示 C# 堆栈跟踪时出现问题

我在 C# 程序中有句柄泄漏。我正在尝试使用 WinDbg 使用 !htrace 对其进行诊断,大致如this answer中所述,但是当我在 WinDbg 中运行 !htrace -diff 时,我看到的堆栈跟踪不显示我的 C# 函数的名称(或甚至我的 .net 程序集)。

我创建了一个小测试程序来说明我的困难。这个程序除了“泄漏”句柄之外什么都不做。

我编译了程序集,然后在 WinDbg 中我转到“文件”->“打开可执行文件”并选择我的程序 (D:\Projects\Sandpit\bin\Debug\Sandpit.exe)。我继续执行程序,中断它,然后运行“!htrace -enable”,然后继续运行一段时间,然后中断并运行“!htrace -diff”。这就是我得到的:

如您所见,堆栈跟踪缺少我的 C# 函数名称“Main”和“Fun1”。我相信“System_ni+0x ...”框架可能是我的功能框架,但我不知道。我的问题是,如何让 WinDbg 在堆栈跟踪中显示我的 C# 函数的函数名称?

额外信息:我的 WinDbg 符号搜索路径是

SRV C:/symbols http://msdl.microsoft.com/download/symbols;D :\Projects\Sandpit\bin\Debug;srv*

当我在 WinDbg 中打开可执行文件时,我没有收到任何错误。在输出目录(“D:\Projects\Sandpit\bin\Debug”)中有一个名为“Sandpit.pdb”的文件。该项目是在本地构建的,因此 pdb 文件应与 exe 匹配。我从这里下载了 WinDbg 。我在 Visual Studio 的项目设置中选中了“启用本机代码调试”。

0 投票
1 回答
235 浏览

c# - 处理 .Net 2.0 windows 应用程序中的泄漏

我们必须处理应用程序中的泄漏。

我们正在我们的应用程序中测试一些查看器进行大约 200 个打开和关闭,发现句柄数约为 200。

对于同一个查看器,内存使用量是恒定的,GDI 计数也是恒定的。

问题是句柄每次都在增加,但不是恒定的。有时增加 5,有时增加 1,有时减少。我们无法看到 GDI 泄漏的持续增加。

我们已经取消订阅了应用程序中注册的所有事件,并且还释放了应用程序中使用的所有控件。在应用程序中也存在一些内存泄漏之前。现在处理所有控件后,它保持不变。

那么在这种情况下,我们还需要检查什么。我们并不感到困惑,因为内存/GDI 计数是恒定的,而句柄只会增加。

任何建议表示赞赏。

0 投票
1 回答
1949 浏览

c# - 如何检测 c# 应用程序中的句柄泄漏

在我的 C# 应用程序中,当它运行时,我可以在 Windows 任务管理器中清楚地看到句柄列的数量在稳步增加。内存很好,没有增加,只有句柄达到了很高的水平。

我怎样才能调试这个泄漏,检测它并解决句柄泄漏。

谢谢!

0 投票
1 回答
5822 浏览

c# - 确定 GDI 句柄和 USER 对象的数量

我们为我们的 Windows 窗体 UI 渲染引擎开发了一个小型测试套件,它允许在以自动化方式运行测试用例时测量性能并检测内存泄漏。现在我们也想检查句柄泄漏。在桌面平台上我们可以使用这段代码:

此方法在 Windows Mobile 中似乎不可用。是否有另一种方法可以在 Windows Mobile/CE 上以编程方式确定这些值?