.net 精简异常/Environment.StackTrace有意义

.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

我正在分析遗留应用程序中的错误,并对其进行清理和改进。我有一些堆栈跟踪记录到数据库中,但它的存储量有一个限制(VARCHAR2(1000)),并且在系统的深处发生错误。数据

   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);