Инструментация кода логгерами.
Бредовые идеи про отладку программ на ходу.
1. макрос/плагин компилятора, вызываемый при компиляции вызова любой функции или метода,а так же при компиляции тела этой функции.
2. макрос строит дерево вызовов функций и делает из него статическую структуру в памяти программы, с флагом isDebug на каждую функцию. Структура доступа через какой-нибудь дико профайлинговый рантайм API
3. в каждую функцию макрос добавляет проверку ее флага и если он включен - вывод уникального идентификатора стек-трейса вызова функции, параметров при вызове и вывод результата при выходе, в логи.
4. чтобы стек-трейс не генерить в рантайме - в каждый вызов при компиляции добавляется статическая информация, "откуда меня вызвали", в виде ссылки на граф вариантов вызова этой функции.
Ежели функции ленивые - то вместо стек-трейса будет что-нибудь вроде "где thunk создали, а где зафорсили", но это надо подумать, как такое представить наглядным образом.
1. макрос/плагин компилятора, вызываемый при компиляции вызова любой функции или метода,а так же при компиляции тела этой функции.
2. макрос строит дерево вызовов функций и делает из него статическую структуру в памяти программы, с флагом isDebug на каждую функцию. Структура доступа через какой-нибудь дико профайлинговый рантайм API
3. в каждую функцию макрос добавляет проверку ее флага и если он включен - вывод уникального идентификатора стек-трейса вызова функции, параметров при вызове и вывод результата при выходе, в логи.
4. чтобы стек-трейс не генерить в рантайме - в каждый вызов при компиляции добавляется статическая информация, "откуда меня вызвали", в виде ссылки на граф вариантов вызова этой функции.
Ежели функции ленивые - то вместо стек-трейса будет что-нибудь вроде "где thunk создали, а где зафорсили", но это надо подумать, как такое представить наглядным образом.
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
или valgrind
или любая виртуальная машину куда можно в ojbect_call() хакнуться
no subject
правильная инструментация может быть только с полной информацией начиная с AST компилятора.
no subject
Вообще посмотри на честный аппаратный instruction tracing -- получишь вид на execution flow вплоть до конкретных бранчей. Ключевые слова Intel Processor Trace или Embedded Trace Macrocell (этот на ARM).
no subject
qemu/tcg
no subject
no subject
а как быть с рекурсивными и взаимно-рекурсивными функциями?
ЗЫ: есть подозрение, что тебе нужен common lisp
no subject
Еще более плохой вариант - это если функции вызывать через reflection :)
no subject
no subject
no subject
Но надо решать, что делать с вызовами функций по указателю (и ваще динамической диспетчеризацией), замыканиями (и ваще анонимными функциями), вызовами функций из eval, и тд.
no subject
no subject
no subject
Вот с 2-3 заебётесь. Да и вообще со всем этим логом.
no subject
no subject
no subject
Можно сделать хуки на вход / выход из функции, только, не выдумывая ничего сложного, слать UDP сообщения.
У нас так и сделано, только расстановка макросов руками.
Грубо DBG(context, level, message), а потом этот level можно выставить для конкретного context в ран-тайм.