живая отладка переполнения стека

Во-первых, есть div с идентификатором red, и после нажатия на этот div он переключает id на green, что происходит динамически, поэтому в этом случае мы используем делегирование события . Попробуйте следующий код -

jQuery(document).ready(function($) {
  $(".parent").on('click', '#red', function() {
    $(this).attr("id", "green");
  });

  $(".parent").on('click', '#green', function() {
    $(this).attr("id", "red");
  });
});
div {
  margin: 0 auto;
  width: 100px;
  height: 100px;
}

#red {
  background-color: red;
}

#green {
  background-color: green;
}

6
задан Nifle 9 February 2010 в 18:41
поделиться

5 ответов

Как только вы столкнулись с переполнением стека, вам почти не повезло в устранении проблемы - потеря пространства в стеке оставляет вашу программу -детерминированное состояние, поэтому вы не можете полагаться на любой информации, содержащейся в нем в этот момент - любая трассировка стека, которую вы пытаетесь получить, может быть повреждена и может легко указать вам неправильное направление. То есть, как только возникает StackOverflowException, становится слишком поздно.

Также, согласно документации , вы не можете перехватить StackOverflowException начиная с .Net 2.0 и далее, поэтому другие предложения окружить ваш код попыткой / catch для этого, вероятно, не будет работать. Это имеет смысл, учитывая побочные эффекты переполнения стека (я удивлен. Net когда-либо позволял вам его ловить).

Ваша единственная реальная возможность - заняться утомительным анализом кода, поиском чего-либо, что может вызвать переполнение стека, и добавлением каких-либо маркеров, чтобы вы могли получить Идея, где они происходят до они происходят. Например, очевидно, что любые рекурсивные методы являются первыми для начала, поэтому дайте им счетчик глубины и выведите свое собственное исключение , если они получат какое-то «необоснованное» значение, которое вы определили, таким образом, вы действительно можете получить допустимая трассировка стека.

8
ответ дан 16 December 2019 в 21:46
поделиться

Как уже говорили другие, вам нужно избегать значений, которые включают кавычки. Вот небольшой CSV-ридер в C♯, который поддерживает значения в кавычках, включая встроенные кавычки и возврат каретки.

Кстати, это код, проверенный модулем. Я публикую его сейчас, потому что этот вопрос, кажется, часто возникает, и другие могут не захотеть целую библиотеку, когда подойдет простая поддержка CSV.

Вы можете использовать ее следующим образом:

using System;
public class test
{
    public static void Main()
    {
        using ( CsvReader reader = new CsvReader( "data.csv" ) )
        {
            foreach( string[] values in reader.RowEnumerator )
            {
                Console.WriteLine( "Row {0} has {1} values.", reader.RowIndex, values.Length );
            }
        }
        Console.ReadLine();
    }
}

Вот классы. Обратите внимание, что вы также можете использовать функцию Csv.Escape для записи действительного CSV.

using System.IO;
using System.Text.RegularExpressions;

public sealed class CsvReader : System.IDisposable
{
    public CsvReader( string fileName ) : this( new FileStream( fileName, FileMode.Open, FileAccess.Read ) )
    {
    }

    public CsvReader( Stream stream )
    {
        __reader = new StreamReader( stream );
    }

    public System.Collections.IEnumerable RowEnumerator
    {
        get {
            if ( null == __reader )
                throw new System.ApplicationException( "I can't start reading without CSV input." );

            __rowno = 0;
            string sLine;
            string sNextLine;

            while ( null != ( sLine = __reader.ReadLine() ) )
            {
                while ( rexRunOnLine.IsMatch( sLine ) && null != ( sNextLine = __reader.ReadLine() ) )
                    sLine += "\n" + sNextLine;

                __rowno++;
                string[] values = rexCsvSplitter.Split( sLine );

                for ( int i = 0; i < values.Length; i++ )
                    values[i] = Csv.Unescape( values[i] );

                yield return values;
            }

            __reader.Close();
        }
    }

    public long RowIndex { get { return __rowno; } }

    public void Dispose()
    {
        if ( null != __reader ) __reader.Dispose();
    }

    //============================================


    private long __rowno = 0;
    private TextReader __reader;
    private static Regex rexCsvSplitter = new Regex( @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))" );
    private static Regex rexRunOnLine = new Regex( @"^[^""]*(?:""[^""]*""[^""]*)*""[^""]*$" );
}

public static class Csv
{
    public static string Escape( string s )
    {
        if ( s.Contains( QUOTE ) )
            s = s.Replace( QUOTE, ESCAPED_QUOTE );

        if ( s.IndexOfAny( CHARACTERS_THAT_MUST_BE_QUOTED ) > -1 )
            s = QUOTE + s + QUOTE;

        return s;
    }

    public static string Unescape( string s )
    {
        if ( s.StartsWith( QUOTE ) && s.EndsWith( QUOTE ) )
        {
            s = s.Substring( 1, s.Length - 2 );

            if ( s.Contains( ESCAPED_QUOTE ) )
                s = s.Replace( ESCAPED_QUOTE, QUOTE );
        }

        return s;
    }


    private const string QUOTE = "\"";
    private const string ESCAPED_QUOTE = "\"\"";
    private static char[] CHARACTERS_THAT_MUST_BE_QUOTED = { ',', '"', '\n' };
}
- 121 --- 1802859--

Мне нравится рекурсивный

function printCountDown(int x, int y) {
  if ( y != x ) printCountDown(x, y++);
  print y + " ";
}

Вы также можете использовать умножение

function printNto1(int x) {
  for(int y=x*(MAXINT*2+1);y<=(MAXINT*2+1);y++) {
    print (y*(MAXINT*2+1)) + " ";
  }
}
- 121 --- 2227164--

Можно ли обернуть ваш код с помощью try-catch , который записывает в EventLog (или файл, или что-то еще ) и запустить эту разовую отладку?

try { ... } catch(SOE) { EventLog.Write(...); throw; }

Вы не сможете отладить,

0
ответ дан 16 December 2019 в 21:46
поделиться

Один из возможных вариантов - использовать блок try / catch на высоком уровне, а затем распечатать или записать в стек трассировка предоставлена ​​исключением. Каждое исключение имеет свойство StackTrace , которое может сказать вам, откуда оно было выброшено. Это не позволит вам выполнять какую-либо интерактивную отладку, но даст вам возможность начать.

0
ответ дан 16 December 2019 в 21:46
поделиться

For what its worth, starting in .NET 4.0, Visual Studio (and any debuggers that rely on the ICorDebug api) gain the ability to debug minidumps. This means you will be able to load the crash dump into the VS debugger on a different computer and see the managed stacks similar to if you had attached a debugger at the time of the crash. See the PDC talk or Rick Byers' blog for more information. Unfortunately this won't help you with the problem at hand, but perhaps it will next time you run into this issue.

0
ответ дан 16 December 2019 в 21:46
поделиться

Take a look at your ADPLUS Crash Mode Debug Log. Посмотрите, есть ли какие-либо нарушения доступа или истинные собственные исключения переполнения стека до того, как будет сгенерировано управляемое исключение StackOverflowException.

Я предполагаю, что в стеке потока есть исключение, которое вы холодно поймаете перед выходом из потока.

Вы могли бы также используйте DebugDiag с www.iis.net, а затем установите правило сбоя и создайте файл полного дампа для нарушений доступа (sxe av) и собственных исключений переполнения стека (sxe sov)

Спасибо, Аарон

0
ответ дан 16 December 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: