Событие C # прямо до и после вызова Debugger.Break ()? - PullRequest
1 голос
/ 11 ноября 2011

Я отлаживаю AI-бота, который получает 'replay' входные данные, чтобы он воспроизводил ранее сыгранный матч. Каждый ход ограничен определенным количеством времени, которое бот использует, чтобы вычислить оставшееся время для текущего хода; это позволяет определить, как использовать оставшееся время поворота. Теперь, что я хотел бы сделать, это отслеживать количество времени, затраченного на отладку (общее время, потраченное в точках останова для этого хода), так что я могу добавить это к оставшемуся времени, чтобы казалось, что выполнение никогда не приостанавливается .

Первоначально я пытался использовать что-то вроде этого:

private DateTime turnTimeStarted;
public TimeSpan TurnTimeRemaining
{
    get { return (turnTimeStarted + TurnTime + TimeSpentInDebugger) - 
                      DateTime.Now; }
}

private DateTime debugStartTime;
private bool inDebugger = false;

private TimeSpan timeSpentInDebugger = new TimeSpan();
public TimeSpan TimeSpentInDebugger
{
    get
    {
         if (!inDebugger) 
             return timeSpentInDebugger;
         return timeSpentInDebugger + (DateTime.Now - debugStartTime);
    }
}

public void Break()
{
    if (Debugger.IsAttached)
    {
        debugStartTime = DateTime.Now;
        inDebugger = true;

        Debugger.Break();

        inDebugger = false;
        timeSpentInDebugger += DateTime.Now - debugStartTime;
    }
}

Проблема с этим заключается в том, что он прерывается на фактическом операторе Debugger.Break() вместо вызова метода Break(), поэтому я в конечном итоге оказываюсь вне контекста кода, который хочу отладить.

То, что я ищу, это что-то вроде набора событий, которые запускаются прямо до и после вызова Debugger.Break, чтобы определить время для входа и выхода из точек останова. Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2011

Я бы посоветовал взглянуть на SlimTune: http://code.google.com/p/slimtune/ и эту статью о DNProfiler от Matt Pietrek http://msdn.microsoft.com/en-us/magazine/cc301725.aspx

0 голосов
/ 11 ноября 2011

Используйте класс Секундомер (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) и начните прямо перед остановкой, остановитесь сразу после и добавьте время по мере необходимости.

...