.net 精简异常/Environment.StackTrace有意义
我正在分析遗留应用程序中的错误,并对其进行清理和改进。我有一些堆栈跟踪记录到数据库中,但它的存储量有一个限制(VARCHAR2(1000)),并且在系统的深处发生错误。数据.net 精简异常/Environment.StackTrace有意义,.net,debugging,stack-trace,text-parsing,error-logging,.net,Debugging,Stack Trace,Text Parsing,Error Logging,我正在分析遗留应用程序中的错误,并对其进行清理和改进。我有一些堆栈跟踪记录到数据库中,但它的存储量有一个限制(VARCHAR2(1000)),并且在系统的深处发生错误。数据 at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc) at System.Data.OracleClient.OracleCommand.Execute(OciStatementH
at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.OracleClient.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
我不在乎所有这些东西——我只需要找出哪个C代码和哪个进程在生成错误。因此,我可以找出根本原因,将代码重构到高质量,并在生成错误率最低的代码时改进每个模块
在我开始写东西之前,是否有人会将堆栈跟踪限制到某些程序集,以便我能够找到根本原因?或者是一个堆栈跟踪解析器或是一些现成的东西,我可以用它在记录错误之前去掉我不感兴趣的东西?最简单的方法是增加限制 亚军最简单的方法是修改日志记录,这样它就可以使用堆栈跟踪的最后1000个字符(如果更长的话),而不是插入整个内容。任何其他解决方案也必须修改日志记录,或者是一个MitM来截取和更改信息,然后再让它继续发送到日志记录程序 您无法更改.NET生成堆栈跟踪文本的方式(例如忽略某些程序集),因此在记录之前,这一切都归结为字符串操作。减少.NET异常的代码 你很幸运,有人读过你的帖子!我想,我把我的错误重新编排成这样的格式,至少让我的眼睛免于阅读史蒂文·金(Steven King)的一本小说,因为这本小说的价值很低: ( 使用此代码:
Trace = Regex.Replace(Trace
, "^.*" + FilterPattern + ".*$\n"
, string.Empty
, RegexOptions.Multiline | RegexOptions.IgnoreCase);
公共共享函数ReduceError(ByVal stExceptionToString作为字符串)作为字符串
尝试
''//拆分为消息和堆栈跟踪项
Dim stMainSplit()作为字符串=拆分(stExceptionToString、vbCrLf和“at”)
如果UBound(stMainSplit)=0,则
返回stExceptionToString
如果结束
''//添加消息
Dim stResults As String=stMainSplit(0)和vbCrLf
作为布尔值的Dim-wasinner
''//标题,如果有堆栈跟踪
如果UBound(stMainSplit)>0,则
stResults&=“函数”&vbTab&“文件”&vbTab&“行”&vbCrLf
如果结束
''//减少堆栈跟踪
对于i作为整数=1到UBound(stMainSplit)
Dim st As String=STMAINSPILT(i)
“”//跳过堆栈跟踪中内部异常后面的行
如果不是,那么
''//从行#信息中拆分子组件
Dim stln()作为字符串=拆分(st,“)”)
如果UBound(stln)=1,则
''/首先把潜艇放在那里
Dim stsub作为字符串=Mid(stln(0),1,InStrRev(stln(0),“(”)-1)
如果InStr(stsub,“.”)为0,则
stsub=Mid(stsub,InStrRev(stsub,“.”+1)
如果结束
stResults&=stsub&vbTab
''//现在如果有文件/行信息,请添加该信息。
Dim stFile As String=“(no.PDB)”
如果0 InStr(stln(1),“\”),则“\”//学习vb;-)
stFile=Replace(Mid(stln(1),InStrRev(stln(1),“\”)+1),“:行”,vbTab)”
''//取下CR和“内部异常…”文本
如果InStr(stFile,vbCrLf)>1,则
stFile=Mid(stFile,1,指令(stFile,vbCrLf)-1)
如果结束
如果结束
stResults&=stFile&vbCrLf
其他的
stResults&=“行拆分依据”)没有(“&vbTab&vbCrLf
如果结束
如果结束
如果0 InStr(st,“内部异常堆栈跟踪结束”),则
bLastWasInner=True
其他的
bLastWasInner=False
如果结束
下一个
返回结果
特例
''//可能也希望在此处返回原始错误。。
返回“将例程汇总为错误的错误:”&ex.ToString
结束尝试
端函数
它放在我在文本框中使用的选项卡中,如果您不关心system.data行,您可以随时排除它们。为.net 1.1编写的,应该转换为c。我最后只是使用正则表达式删除了我不想要的行:
Public Shared Function ReduceError(ByVal stExceptionToString As String) As String
Try
''// split into message and stack trace items
Dim stMainSplit() As String = Split(stExceptionToString, vbCrLf & " at ")
If UBound(stMainSplit) = 0 Then
Return stExceptionToString
End If
''// add the message
Dim stResults As String = stMainSplit(0) & vbCrLf
Dim bLastWasInner As Boolean
''// Headings, if there is a stack trace
If UBound(stMainSplit) > 0 Then
stResults &= "FUNCTION" & vbTab & "FILE" & vbTab & "LINE" & vbCrLf
End If
''// reduce the stack trace
For i As Integer = 1 To UBound(stMainSplit)
Dim st As String = stMainSplit(i)
''// skip the line following inner exception in stack trace
If Not bLastWasInner Then
''// split the sub from line # info
Dim stln() As String = Split(st, ")")
If UBound(stln) = 1 Then
''// first put the sub on there
Dim stsub As String = Mid(stln(0), 1, InStrRev(stln(0), "(") - 1)
If InStr(stsub, ".") <> 0 Then
stsub = Mid(stsub, InStrRev(stsub, ".") + 1)
End If
stResults &= stsub & vbTab
''// Now if there is file/line # info, add that.
Dim stFile As String = "(no .PDB)"
If 0 <> InStr(stln(1), "\") Then '' " //good grief SOF learn vb ;-)
stFile = Replace(Mid(stln(1), InStrRev(stln(1), "\") + 1), ":line ", vbTab) '' "
''// take off CR and 'inner exception..." text
If InStr(stFile, vbCrLf) > 1 Then
stFile = Mid(stFile, 1, InStr(stFile, vbCrLf) - 1)
End If
End If
stResults &= stFile & vbCrLf
Else
stResults &= "Line split by ) has no (" & vbTab & vbCrLf
End If
End If
If 0 <> InStr(st, "End of inner exception stack trace") Then
bLastWasInner = True
Else
bLastWasInner = False
End If
Next
Return stResults
Catch ex As Exception
''// might want to return orig error here as well..
Return "Error summarizing routine as error'd: " & ex.ToString
End Try
End Function
Trace = Regex.Replace(Trace
, "^.*" + FilterPattern + ".*$\n"
, string.Empty
, RegexOptions.Multiline | RegexOptions.IgnoreCase);