08.04.2023, 03:21 | #21 |
Участник
|
Спасибо, словно на съемках Санта Барбара побывал - там действительно проблема с преобразованием...
...у винды есть вот такая функция QueryPerformanceFrequency У утилиты есть конвертер "QueryPerfCounter" с функцией: X++: public static long ConvertQPFTimeToTicks(ulong QPFTime) { if (!initialized) { if (!NativeMethods.QueryPerformanceFrequency(out mFrequency)) { throw new InvalidOperationException(); } initialized = true; } return (long)((double)QPFTime / (double)mFrequency * (double)multiplier); } Только не все логи события "XppUtilFuncEvent" (согласно статистике) желают заполнять данную информацию. Поэтому получаем mFrequency равное 0, а далее "силу бесконечности". |
|
08.04.2023, 11:00 | #22 |
Участник
|
Судя по коду значение должно быть одинаково у всех замеров. Т. Е. MinInt64 у всех. А оно у одних так у других сяк.
Поэтому мне все же кажется что дело в переполнении. |
|
08.04.2023, 17:30 | #23 |
Участник
|
Лог на вход дает валидные данные.
Подставляем значения в формулу: 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); Вот тут погорячился. Трейсер просто последовательно считывает заголовки из файла. Сначала считывается "красивый": Следующий код его обрабатывает: 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"); } Следовательно безопасная e.Properties.TryGetValue<long>("PerfFreq"); выдает не исключение, а 0. Решений проблемы как было 2.5 так и осталось: 1. Выяснить насколько правильно, что файл содержит BuildString в таком виде. 2. Внести коррективы в исполняемый файл добавив обработку состояния, что значение e.Properties.TryGetValue<long>("PerfFreq") нужно использовать для присвоения QueryPerfCounter.Frequency когда оно не равно 0. 2.5 При вставке записи в БД заменять отрицательные значения на 0 - но это скорее так, для галочки вариант. Последний раз редактировалось Товарищ ♂uatr; 08.04.2023 в 17:37. |
|
13.04.2023, 18:22 | #24 |
Участник
|
Привет.
Реализовал самый простой вариант п.2 - целям в полной мере соответствует (миниатюра 1). Архив с дистрибутивом содержащим данное изменение во вложении. П.1 - поверхностно изучал вопрос, результаты исследования можно уместить в одно изображение (миниатюра 2). Последний раз редактировалось Товарищ ♂uatr; 13.04.2023 в 19:52. |
|
|
За это сообщение автора поблагодарили: Logger (20), alexkrut (2). |
03.05.2023, 08:30 | #25 |
Участник
|
Добрый день!
При запуске TraceParser из размещенного в теме дистрибутива получал ошибку BusinessConnector could not be loaded or logon failed. Source code will be disabled. Проблема заключалась в отсутствии config-файла. После добавления проблема исчезла. В файле достаточно следующего содержания Код: <?xml version="1.0"?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> </startup> </configuration> |
|
|
За это сообщение автора поблагодарили: Товарищ ♂uatr (5). |
03.05.2023, 09:40 | #26 |
Administrator
|
Я обычно в клиентской утилите конфигурирования при бизнес-коннекторе выбираю нужную мне конфигурацию (= нужное мне приложение). Удобно, когда трассировка снимается с разных приложений
__________________
Возможно сделать все. Вопрос времени |
|
Теги |
ax2009, trace parser |
|
|