Инструментация кода логгерами.
Nov. 25th, 2014 11:33 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Бредовые идеи про отладку программ на ходу.
1. макрос/плагин компилятора, вызываемый при компиляции вызова любой функции или метода,а так же при компиляции тела этой функции.
2. макрос строит дерево вызовов функций и делает из него статическую структуру в памяти программы, с флагом isDebug на каждую функцию. Структура доступа через какой-нибудь дико профайлинговый рантайм API
3. в каждую функцию макрос добавляет проверку ее флага и если он включен - вывод уникального идентификатора стек-трейса вызова функции, параметров при вызове и вывод результата при выходе, в логи.
4. чтобы стек-трейс не генерить в рантайме - в каждый вызов при компиляции добавляется статическая информация, "откуда меня вызвали", в виде ссылки на граф вариантов вызова этой функции.
Ежели функции ленивые - то вместо стек-трейса будет что-нибудь вроде "где thunk создали, а где зафорсили", но это надо подумать, как такое представить наглядным образом.
1. макрос/плагин компилятора, вызываемый при компиляции вызова любой функции или метода,а так же при компиляции тела этой функции.
2. макрос строит дерево вызовов функций и делает из него статическую структуру в памяти программы, с флагом isDebug на каждую функцию. Структура доступа через какой-нибудь дико профайлинговый рантайм API
3. в каждую функцию макрос добавляет проверку ее флага и если он включен - вывод уникального идентификатора стек-трейса вызова функции, параметров при вызове и вывод результата при выходе, в логи.
4. чтобы стек-трейс не генерить в рантайме - в каждый вызов при компиляции добавляется статическая информация, "откуда меня вызвали", в виде ссылки на граф вариантов вызова этой функции.
Ежели функции ленивые - то вместо стек-трейса будет что-нибудь вроде "где thunk создали, а где зафорсили", но это надо подумать, как такое представить наглядным образом.
no subject
Date: 2014-11-25 08:35 pm (UTC)no subject
Date: 2014-11-25 08:43 pm (UTC)no subject
Date: 2014-11-26 02:07 am (UTC)no subject
Date: 2014-11-25 08:50 pm (UTC)no subject
Date: 2014-11-25 09:01 pm (UTC)no subject
Date: 2014-11-25 09:10 pm (UTC)no subject
Date: 2014-11-25 09:08 pm (UTC)no subject
Date: 2014-11-25 09:12 pm (UTC)или valgrind
или любая виртуальная машину куда можно в ojbect_call() хакнуться
no subject
Date: 2014-11-25 09:33 pm (UTC)правильная инструментация может быть только с полной информацией начиная с AST компилятора.
no subject
Date: 2014-11-25 10:00 pm (UTC)Вообще посмотри на честный аппаратный instruction tracing -- получишь вид на execution flow вплоть до конкретных бранчей. Ключевые слова Intel Processor Trace или Embedded Trace Macrocell (этот на ARM).
no subject
Date: 2014-11-25 10:08 pm (UTC)qemu/tcg
no subject
Date: 2014-11-25 10:13 pm (UTC)no subject
Date: 2014-11-25 09:46 pm (UTC)а как быть с рекурсивными и взаимно-рекурсивными функциями?
ЗЫ: есть подозрение, что тебе нужен common lisp
no subject
Date: 2014-11-25 10:03 pm (UTC)Еще более плохой вариант - это если функции вызывать через reflection :)
no subject
Date: 2014-11-25 10:16 pm (UTC)no subject
Date: 2014-11-26 03:52 am (UTC)no subject
Date: 2014-11-26 03:58 am (UTC)Но надо решать, что делать с вызовами функций по указателю (и ваще динамической диспетчеризацией), замыканиями (и ваще анонимными функциями), вызовами функций из eval, и тд.
no subject
Date: 2014-11-25 10:25 pm (UTC)no subject
Date: 2014-11-25 11:43 pm (UTC)no subject
Date: 2014-11-26 10:02 am (UTC)Вот с 2-3 заебётесь. Да и вообще со всем этим логом.
no subject
Date: 2014-11-26 11:16 am (UTC)no subject
Date: 2014-11-27 05:37 pm (UTC)no subject
Date: 2014-12-03 10:58 pm (UTC)Можно сделать хуки на вход / выход из функции, только, не выдумывая ничего сложного, слать UDP сообщения.
У нас так и сделано, только расстановка макросов руками.
Грубо DBG(context, level, message), а потом этот level можно выставить для конкретного context в ран-тайм.