gpt4 book ai didi

c# - 错误 : a SafeHandle or CriticalHandle of type ZLibStreamHandle failed to properly release

转载 作者:行者123 更新时间:2023-11-30 14:26:00 29 4
gpt4 key购买 nike

我在流方面的工作不多,所以我假设我这里的某个地方存在编码错误。

   public static SqlBytes Compress(SqlBytes input)
{
byte[] data = (byte[])input.Value;
using (MemoryStream memstream = new MemoryStream(data))
{

using (GZipStream zipped = new GZipStream(memstream, CompressionMode.Compress))
{
using (MemoryStream output = new MemoryStream())
{
zipped.CopyTo(output);
return new SqlBytes(output.ToArray());
}

}

}
}

这是 SQL Server 2012 CLR 中的错​​误:

Msg 10323, Level 16, State 49, Line 1
Invalid user code has been identified by .Net Framework Managed Debug Assistant 'releaseHandleFailed':
A SafeHandle or CriticalHandle of type 'ZLibStreamHandle' failed to properly release the handle with value 0x0000000000000000. This usually indicates that the handle was released incorrectly via another means (such as extracting the handle using DangerousGetHandle and closing it directly or building another SafeHandle around it.)
at System.Runtime.InteropServices.SafeHandle.InternalDispose()
at System.IO.Compression.DeflaterZLib.Dispose(Boolean disposing)
at System.IO.Compression.DeflateStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()
at System.IO.Compression.GZipStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()
at UserDefinedFunctions.Compress(SqlBytes input)
at SQLCLR_Eval(IntPtr , IntPtr , IntPtr )

最佳答案

identified by .Net Framework Managed Debug Assistant

这不是异常,只是来自 MDA(托管调试助手)的通知。 CLR 中集成了少量代码,用于检查常见的运行时错误。没有硬异常的帮助就很难诊断的那种。只有在使用调试器时才会收到 MDA 通知。并且只有在启用 MDA 时,大多数情况下才不会。

'releaseHandleFailed'

说出来的 MDA 是检查 SafeHandle 是否被正确使用的 MDA。在这种特定情况下,它是 ZLibStreamHandle class .实际的解/压缩是由 Zlib 完成的,Zlib 是一个用 native 代码编写的开源库。 SafeHandles 通常用于管理非托管资源,它们确保使用关键终结器释放此类资源。

releaseHandleFailed MDA 值得注意的是它通常被关闭。它应该由编写 SafeHandle 类的程序员打开,例如编写 ZLibStreamHandle 的 Microsoft 程序员。因此,虽然这个通知背后的错误很可能经常遇到,但几乎没有人见过它。从未诊断出的错误永远不会得到修复。

failed to properly release the handle with value 0x0000000000000000

这告诉您 MDA 警告完全是良性的。没有实际的非托管资源被不正确地释放,也不会出错,底层句柄为空。当您按 F5 继续运行时,您的程序将继续愉快地运行。除了验证 4.5 框架中更改的任何单元测试外,MDA 在单元测试中也不活跃。


然而,某些事情确实出了问题,不应该为空句柄创建 ZLibStreamHandle 对象。我看不出有什么明显的方法可以在类里面搞砸。当然,最初的 Microsoft 开发人员也没有看到它 :) 此 MDA 通常由终结器触发。这里不是这种情况,using 语句(又名 Dispose() 调用)触发了它。这很不寻常,我怀疑您在收到异常告诉您 native 代码中出现某些问题之前就已获得此 MDA。发生这种情况是因为 using 语句生成了一个在报告异常之前执行的 finally block 。如果那是准确的,那么按 F5 应该会揭示真正的问题。

对于框架代码中的错误,您无能为力。除了报告它以便 Microsoft 修复它之外,还可以使用 connect.microsoft.com 告诉他们这件事。

然后关闭 MDA,这样您就可以像其他人一样愉快地忽略它。调试 > 异常 > 托管调试助手 > 取消勾选 ReleaseHandleFailed。如果您都勾选了它们,这是意外启用 MDA 的最典型方式,然后重置父项的复选框。

关于c# - 错误 : a SafeHandle or CriticalHandle of type ZLibStreamHandle failed to properly release,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36703705/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com