Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Профайлер/трассировщик модулей 1С (число прочтений - 7425 )
Valar
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 30
Зарегистрирован: 04. Сентября 2006
Профайлер/трассировщик модулей 1С
13. Января 2007 :: 12:08
Печать  
Хочу реализовать следующие идеи:
1.      В реальном времени вести статистику по вызовам процедур и функции. Подсчёт времени выполнения и количества вызовов.
2.      При появлении ошибки во время выполнения модуля выводить стек вызовов.

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

Реализация этих идей штатными средствами 1С влечёт к заметной потере производительности. Может разработчики 1CPP подскажут в каком направлении искать, чтобы реализовать эти идеи внутренними методами 1С?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Профайлер/трассировщик модулей 1С
Ответ #1 - 15. Января 2007 :: 06:35
Печать  
Копай в направлении Отладчика.
Замер производительности.
  
Наверх
 
IP записан
 
Valar
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 30
Зарегистрирован: 04. Сентября 2006
Re: Профайлер/трассировщик модулей 1С
Ответ #2 - 16. Января 2007 :: 16:24
Печать  
Если кому интересно могу написать что я раскопал
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Профайлер/трассировщик модулей 1С
Ответ #3 - 16. Января 2007 :: 16:34
Печать  
Конечно, пиши.
Родина тебя не забудет Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Valar
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 30
Зарегистрирован: 04. Сентября 2006
Re: Профайлер/трассировщик модулей 1С
Ответ #4 - 16. Января 2007 :: 21:34
Печать  
Итак. Предприятие с Отладчиком общаются посредство отображаемого в память файла (далее файл) и сообщениями Windows. При старте 1С создаёт файл посредством метода CTraceInterface:: Open(). При наступлении определенного события Предприятие посылает Отладчику сообщение методом CTraceInterface::SendCommandToTracer(). Для синхронизации используется Mutex. При запуске отладчик заполняет в файле некоторые поля: устанавливает хэндл своего окна и путь к базе данных.
CTraceInterface  - основной класс, используемый для связи Предприятия с Отладчиком. Опишем его основные методы и атрибуты:
1.      static class CTraceDataMap *  m_pData. В этом атрибуте хранится адрес данных файла.
2.      static class CTraceDataMap *  Open(). Создаёт файл. Основные функции метода:
     a.      m_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4316, "1Cv77MapedFile");
     b.      LPVOID pData = MapViewOfFile(m_hMapFile,      FILE_MAP_ALL_ACCESS, 0, 0, 4316);
     c.      m_pData  = (CTraceDataMap *)pData;
3.      static int  IsTraced(). В режиме «Предприятия» проверяет, запущен ли Отладчик. Проверяет заполнен ли hWnd отладчика, проверяет существует ли окно с таким хэндлом функцией IsWindow(), сравнивает путь к базе с путём, который установил Отладчик. Если всё правильно, возвращает 1 иначе 0. В основном вызывается из класса CBLModule7 из методов OnStartExecution(), OnNextLine(), OnStopExecution(), OnEnterProc(), OnExitProc(), ModifyBreakPoints(), StopProfileOnExit().
4.      static class CTraceDataMap *  GetData(). Возвращает атрибут m_pData. Вызывается в основном там же где и метод IsTraced().
5.      static void  SendCommandToTracer(). В режиме «Предприятия» посылает сообщение Windows Отладчику вызовом функции SendMessage(hWnd, 273, 32846, 0). hWnd – хэндл окна отладчика. В основном вызывается из класса CBLModule7 из методов OnNextLine(), OnStopExecution(), ModifyBreakPoints(), StopProfileOnExit().

Структура файла:
class CMyBreakPoint
{
public:
     int m_LineNumber; // номер строки модуля
     int m_Enabled; // признак активной точки останова
     int m_ConditionStringLength; // длина выражения в условии точки останова
     int m_Unkn1;
};

class CTraceDataMap
{
public:
     HANDLE      m_hWnd; // Хэндл окна отладчика
     int            m_IsTraceeActive; // возвращает CTraceInterface::IsTraceeActive()
     int            m_Unkn1;
     char            m_DBDir[0x104]; // путь к базе данных
     int            m_Unkn4;
     int            m_Unkn5;
     int            m_Unkn6;
     char            m_ModuleName[0x100]; // замечены строки: ModuleText, SubList, Subconto, Journal, Document и т.д.
     int            m_Unkn8;
     int            m_Unkn9;
     int            m_ModuleId; // возможно Ид модуля. В основном совпадает с Ид метаданных.
     int            m_LineStoped; // возвращает CTraceInterface::GetLineStoped()
     int            m_Unkn11;
     int            m_Unkn12;
     CMyBreakPoint      m_MyBreakPoints[200]; // массив точек останова. На один модуль максимум 200.
     char            m_Unkn13[0x100]; // возможно строка с выражением, которое вычисляет Предприятие. Замечены выражения из табло Отладчика и условий точек останова.
     char            m_Unkn14[0x100]; // возможно строка с результатом вычисления выражения
     int            m_Unkn15;
     int            m_Unkn16;
     int            m_Unkn17;
     int            m_Unkn18;
     int            m_Unkn19;
     int            m_Unkn20;
     int            m_Unkn21;
     int            m_Unkn22;
     int            m_Unkn23;
     int            m_IsProfilerOn; // возвращает CTraceInterface::IsProfilerOn()
};
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Профайлер/трассировщик модулей 1С
Ответ #5 - 17. Января 2007 :: 05:15
Печать  
Молодец.

1) Тебе прямая дорога в нашу совместную базу Wiki
http://www.1cpp.ru/wiki/?wakka=Izmenenija&v=zam
2) Не мог бы ты выложить h-файл, в который включены исследованные тобой классы.
Сейчас непонятен порядок следования полей/методов в классе.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Профайлер/трассировщик модулей 1С
Ответ #6 - 17. Января 2007 :: 06:41
Печать  
О как.
Часть данных, конечно известная.
Теперь надо бы ковырять сам отладчик.
Как он дерево модулей хранит.
Возможно найдется способ нормальной отладки классов 1С++.
(хинт: если переименовать tracer.dll в tracer1C.dll, написать свою tracer.dll и в ней сделать LoadLibrary("tracer1C.dll"), то отладчик 1С работает как ни в чем не бывало, только уже с твоим загруженным кодом Улыбка
  
Наверх
 
IP записан
 
Valar
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 30
Зарегистрирован: 04. Сентября 2006
Re: Профайлер/трассировщик модулей 1С
Ответ #7 - 17. Января 2007 :: 07:25
Печать  
artbear писал(а) 17. Января 2007 :: 05:15:
2) Не мог бы ты выложить h-файл, в который включены исследованные тобой классы.
Сейчас непонятен порядок следования полей/методов в классе.

Класс CTraceInterface есть в seven.h. Я туда еще добавил описание классов CTraceDataMap и CMyBreakPoint.
  
Наверх
 
IP записан
 
Valar
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 30
Зарегистрирован: 04. Сентября 2006
Re: Профайлер/трассировщик модулей 1С
Ответ #8 - 17. Января 2007 :: 07:59
Печать  
Я накропал небольшую прогу, которая показывает содержимое файла в памяти.
Для компиляции нужно прописать путь к 1CHEADERS, в seven.h вставить описание классов CMyBreakPoint  и CTraceDataMap. Исправить путь к базе данных в файле 1c_tracerView.cpp в методе CMy1c_tracerView:УжасnCreate() переменная DBDir. Вывод содержимого файла в памяти выполняет метод CMy1c_tracerView:УжасnCommand()
Сначало нужно запустить 1С, потом эту прогу. Лазя по справочникам, документам смотреть что меняется в файле.
  

1c_tracer.rar ( 70 KB | Загрузки )
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Профайлер/трассировщик модулей 1С
Ответ #9 - 24. Февраля 2007 :: 11:01
Печать  
Valar

Все, что ты написал - правда, до последнего слова.

Твой труд навел меня не некоторые исследования в области отладки классов.
оригинал:  http://itland.ru/forum//index.php?showtopic=19056
дубль: http://www.1cpp.ru/forum/YaBB.pl?num=1172314618

Несмотря на то, что решение оказалось весьма неожиданным и лежащим в иной плоскости, путь к нему был небыстрым и проходящим через результаты твоей работы.

Спасибо тебе, короче говоря. Улыбка
Успехов в дальнейших исследованиях.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать