Исключение для похудения / Environment.StackTrace Значительно - PullRequest
3 голосов
/ 24 июня 2011

Я анализирую ошибки в унаследованном приложении по мере его очистки и улучшения.У меня есть несколько трассировок стека, записываемых в базу данных, но есть предел (VARCHAR2 (1000)) того, сколько он хранит, и ошибки происходят глубоко внутри System.Data ...

   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 # и какой процесс генерирует ошибки.Поэтому я могу выяснить основную причину, реорганизовать код в качество и улучшить каждый модуль по мере того, как я сталкиваюсь с самым дешевым кодом, вызывающим наибольшее количество ошибок.

Прежде чем я уйду и напишу что-то, есть ли у кого-то что-нибудьчто ограничит трассировку стека определенными сборками, чтобы я мог найти причину?Или анализатор трассировки стека или что-то готовое к использованию, которое я могу использовать, чтобы убрать то, что мне не интересно, до регистрации ошибки?

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Код для уменьшения исключения .Net

Вам повезло - кто-то, кто сделал это, прочитал ваш пост! Я бы понял, что я избавил свои глаза от прочтения, по крайней мере, пуха из романа Стивена Кинга, переформатировав мои ошибки во что-то вроде этого:

(

 didn't honor my tabstops so it looks better in real life) </p>

<pre><code>System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
FUNCTION    FILE    LINE
CoCreateInstance    (no .PDB)
CreateWithoutLicense    (no .PDB)
CreateWithLicense   (no .PDB)
CreateInstanceCore  (no .PDB)
CreateInstance  (no .PDB)
GetOcxCreate    (no .PDB)
TransitionUpTo  (no .PDB)
CreateHandle    (no .PDB)
CreateControl   (no .PDB)
CreateControl   (no .PDB)
EndInit (no .PDB)
InitializeComponent frmGetSig.Designer.vb   187
ctor    frmGetSig.vb    264
btnSign_Click   ucSignCapture_v2.vb 306
</code>

Используя этот код:

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

Он вставляет вкладки, которые я использую в текстовом поле, достаточно легко изменить, если хотите; если вас не интересуют строки system.data, вы всегда можете их исключить. Написано для .net 1.1, должно конвертироваться в c # хорошо.

1 голос
/ 24 июня 2011

Самый простой способ - увеличить лимит.

Самый простой способ - занести второе место в журнал, чтобы он занял последние 1000 символов (если он длиннее) трассировки стека, а не вставил все целиком. Любое другое решение также должно было бы изменить протоколирование или использовать MitM для перехвата и изменения информации перед тем, как позволить ей перейти к регистратору.

Вы не можете изменить способ, которым .NET создает текст трассировки стека (например, игнорирование определенных сборок), поэтому все сводится к манипуляции со строками перед регистрацией.

0 голосов
/ 30 июня 2011

В итоге я использовал Regex для удаления ненужных мне строк:

Trace = Regex.Replace(Trace
                      , "^.*" + FilterPattern + ".*$\n"
                      , string.Empty
                      , RegexOptions.Multiline | RegexOptions.IgnoreCase);
...