我将一个.NET 4应用程序编写为Windows服务,其中包含非托管组件,并且正在向我的log4net日志打印AccessViolationException,但不会导致应用程序崩溃。关于这个问题的一切听起来都不可能以下是我认为正在发生的事情,我想知道我的下一步应该是开发人员应该做什么的?在与生产相同的数据源的并行重放环境中不会发生此问题。
从.NET Framework 4开始,
AccessViolationException
公共语言运行库抛出的异常不由处理 如果异常,结构化异常处理程序中的catch语句 发生在公共语言运行库保留的内存之外。 要处理此类AccessViolationException
例外,您应该申请HandleProcessCorruptedStateExceptionsAttribute
属性 抛出异常的方法。
这是匿名堆栈跟踪:
2016-08-16 20:58:38,207错误:编排:初始化 System.AccessViolationException:尝试读取或写入受保护的 记忆。这通常表明其他记忆已损坏 在Microsoft.SqlServer.Dts.Runtime.Package.Execute()at DataLoader.Orchestration.DoWork()in D:\ SourceCode \ DataLoader \ Mainline \ Core \ Orchestration.cs:第198行 System.AccessViolationException:尝试读取或写入受保护的 记忆。这通常表明其他记忆已损坏 在Microsoft.SqlServer.Dts.Runtime.Package.Execute()at DataLoader.Orchestration.DoWork()in D:\ SourceCode \ DataLoader \ Mainline \ Core \ Orchestration.cs:第198行
这里大致是一段近似代码正在做的代码:
public class Orchestration
{
private Application m_DTSApplication;
private Package m_DTSPackage;
public IntradayOrchestration()
{
InitializeDTSPackage();
}
private void InitiatlizeDTSPackage()
{
m_DTSPackageLocation = ConfigurationManager.AppSettings["DTSPackageLocation"].ToString();
m_DTSPackageConfigLocation = ConfigurationManager.AppSettings["DTSPackageConfigLocation"].ToString();
m_DTSApplication = new Application();
m_DTSApplication.PackagePassword = ConfigurationManager.AppSettings["DTSPackagePassword"];
m_DTSPackage = m_DTSApplication.LoadPackage(m_DTSPackageLocation, null);
m_DTSPackage.ImportConfigurationFile(m_DTSPackageConfigLocation);
}
private void DoWork()
{
try
{
Stopwatch sw = Stopwatch.StartNew();
while (true)
{
sw.Start();
DTSExecResult result = m_DTSPackage.Execute();
sw.Stop();
Logger.ReportInfo(DateTime.Now.ToString() + "Time taken by dts package= " + sw.ElapsedMilliseconds.ToString());
// Check retuns status and check for errors on Job execution
if (result != DTSExecResult.Success || m_DTSPackage.Errors != null)
{
if (m_DTSPackage.Errors != null)
{
foreach (DtsError error in m_DTSPackage.Errors)
{
string errorMesg = string.Format("Orchestration: SSIS Package [{0}] Error: Code[{1}] Source[{2}] Component[{3}] Description[{4}]", m_DTSPackage.Name, error.ErrorCode, error.Source, error.SubComponent, error.Description);
Logger.ReportError(errorMesg, new ApplicationException(errorMesg));
}
}
else
{
string errorMesg = string.Format("Orchestration: SSIS Package [{0}] did not complete successfully. Return status [{1}]", m_DTSPackage.Name, result.ToString());
Logger.ReportError(errorMesg, new ApplicationException(errorMesg));
}
}
else
{
Logger.ReportInfo(
string.Format("Orchestration: SSIS Package [{0}] completed successfully", m_DTSPackage.Name));
}
}
catch (Exception ex)
{
Logger.ReportError(
string.Format("Orchestration: SSIS Package [{0}] completed successfully", m_DTSPackage.Name));
}
}
}
答案 0 :(得分:0)
由于跨越.NET 4到.NET 2的运行时环境,根本原因实际上是“空域”。
另外,事实证明,SQL Server 2008 R2 SSIS Runtime可能在SQL日志记录子组件中存在双重可用内存错误。