Лог на вход дает валидные данные.
Подставляем значения в формулу:
return (long)((double)QPFTime / (double)mFrequency * (double)multiplier);
Берем обычное консольное приложение и 4 переменные создаем.
X++:
double a = (double)QPFTime; // 2, пример из изображения выше
double b = 0; // проблемная переменная
double c = (double)multiplier; // 10000000, на само деле может быть любой
double d = (a / b * c);
Получаем infinity.
Цитата:
Сообщение от
Товарищ ♂uatr
желающей видеть данное свойство у каждого события лога.
Вот тут погорячился. Трейсер просто последовательно считывает заголовки из файла.
Сначала считывается "красивый":
Следующий код его обрабатывает:
X++:
private void SetCurrentTraceInfo(EventArrivedEventArgs e)
{
QueryPerfCounter.Frequency = e.Properties.TryGetValue<long>("PerfFreq");
TraceInfo.Current.TotalBuffers = e.Properties.TryGetValue<uint>("BuffersWritten");
TraceInfo.Current.EventsDropped = e.Properties.TryGetValue<int>("EventsLost");
TraceInfo.Current.TimeStampBeginTick = e.Properties.TryGetValue<long>("StartTime");
TraceInfo.Current.TimeStampEndTick = e.Properties.TryGetValue<long>("EndTime");
}
А когда дело доходит до обработки событий типа "XppUtilFuncEvent" (в БД он представлен как [dbo].[TraceLines] с [CallTypeId] равный 16) - предварительно "прилетает" заголовок с единственным свойством:
Следовательно безопасная e.Properties.TryGetValue<long>("PerfFreq"); выдает не исключение, а 0.
Решений проблемы как было 2.5 так и осталось:
1. Выяснить насколько правильно, что файл содержит BuildString в таком виде.
2. Внести коррективы в исполняемый файл добавив обработку состояния, что значение e.Properties.TryGetValue<long>("PerfFreq") нужно использовать для присвоения QueryPerfCounter.Frequency когда оно не равно 0.
2.5 При вставке записи в БД заменять отрицательные значения на 0 - но это скорее так, для галочки вариант.