metaclass: (Default)
[personal profile] metaclass
Бредовые идеи про отладку программ на ходу.

1. макрос/плагин компилятора, вызываемый при компиляции вызова любой функции или метода,а так же при компиляции тела этой функции.
2. макрос строит дерево вызовов функций и делает из него статическую структуру в памяти программы, с флагом isDebug на каждую функцию. Структура доступа через какой-нибудь дико профайлинговый рантайм API
3. в каждую функцию макрос добавляет проверку ее флага и если он включен - вывод уникального идентификатора стек-трейса вызова функции, параметров при вызове и вывод результата при выходе, в логи.
4. чтобы стек-трейс не генерить в рантайме - в каждый вызов при компиляции добавляется статическая информация, "откуда меня вызвали", в виде ссылки на граф вариантов вызова этой функции.

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

Date: 2014-11-25 08:35 pm (UTC)
From: [identity profile] yole.livejournal.com
Как сложно жить людям, у которых нет нормальной виртуальной машины. https://cloud.google.com/tools/cloud-debugger

Date: 2014-11-25 08:43 pm (UTC)
From: [identity profile] metaclass.livejournal.com
А, жабья инструментация на данный момент вроде самая адекватная из всех.

Date: 2014-11-26 02:07 am (UTC)
From: [identity profile] mxcv8scv.livejournal.com
метаклассу особенно трудно, когда приступы аутизма с когнитивным дисонансом мешают ему работать.

Date: 2014-11-25 08:50 pm (UTC)
From: [identity profile] kong-en-ge.livejournal.com
Читая вас, понимаю, что ежиха уже развелась и выписывается...

Date: 2014-11-25 09:01 pm (UTC)
From: [identity profile] metaclass.livejournal.com
О. А ведь такими макросами можно размечать вызовы функций в ситиинфе и на ходу их упаковывать-распаковывать при вызовах.

Date: 2014-11-25 09:10 pm (UTC)
From: [identity profile] kong-en-ge.livejournal.com
Так еще 10 лет назад сделано же.

Date: 2014-11-25 09:08 pm (UTC)
From: [identity profile] cottidianus.livejournal.com
называется systemtap

Date: 2014-11-25 09:12 pm (UTC)
From: [identity profile] cottidianus.livejournal.com
или lttng
или valgrind
или любая виртуальная машину куда можно в ojbect_call() хакнуться

Date: 2014-11-25 09:33 pm (UTC)
From: [identity profile] metaclass.livejournal.com
со стороны ассемблера без символов ты ж не увидишь ни calling convention, ни типа данных.
правильная инструментация может быть только с полной информацией начиная с AST компилятора.

Date: 2014-11-25 10:00 pm (UTC)
From: [identity profile] kiryl.livejournal.com
Кто мешает её сопоставить пост фактум? debuginfo положить где-нить рядом что б было.

Вообще посмотри на честный аппаратный instruction tracing -- получишь вид на execution flow вплоть до конкретных бранчей. Ключевые слова Intel Processor Trace или Embedded Trace Macrocell (этот на ARM).

Date: 2014-11-25 09:46 pm (UTC)
From: [identity profile] swizard.livejournal.com
> "откуда меня вызвали", в виде ссылки на граф вариантов вызова этой функции

а как быть с рекурсивными и взаимно-рекурсивными функциями?

ЗЫ: есть подозрение, что тебе нужен common lisp

Date: 2014-11-25 10:03 pm (UTC)
From: [identity profile] metaclass.livejournal.com
По идее взаимно-рекурсивные будут петлями в таком графе, хотя уникально идентифицировать путь вызова в таком случае, без количества проходов по петле не получится.
Еще более плохой вариант - это если функции вызывать через reflection :)

Date: 2014-11-25 10:16 pm (UTC)
From: [identity profile] kiryl.livejournal.com
ещё веселее если по дороге где-нить jit или ещё какая runtime-кодогенерация ;)

Date: 2014-11-26 03:52 am (UTC)
From: [identity profile] swizard.livejournal.com
Да не, какая кодогенерация, там уже банальный вызов функции по указателю (например, виртуальный метод) окажется серьёзной проблемой.

Date: 2014-11-26 03:58 am (UTC)
From: [identity profile] swizard.livejournal.com
Ну если количество переходов не нужно, то уже проще. В кл, например, я примерно уже представляю, как это всё сделать :)

Но надо решать, что делать с вызовами функций по указателю (и ваще динамической диспетчеризацией), замыканиями (и ваще анонимными функциями), вызовами функций из eval, и тд.

Date: 2014-11-25 10:25 pm (UTC)
From: [identity profile] vit-r.livejournal.com
А смысл?

Date: 2014-11-25 11:43 pm (UTC)

Date: 2014-11-26 10:02 am (UTC)
From: [identity profile] aamonster.livejournal.com
Про какой язык речь? Для крестиков (в MSVC и, кажется, в GCC тоже) можно в начале каждой функции дёргать специальный обработчик, только там чутка извратиться надо с его написанием (и компилить его в отдельную либу, включать в тот же проект нежелательно)

Вот с 2-3 заебётесь. Да и вообще со всем этим логом.

Date: 2014-11-26 11:16 am (UTC)
From: [identity profile] ext_1684112 (from livejournal.com)
А PostSharp вы смотрели?

Date: 2014-11-27 05:37 pm (UTC)
From: [identity profile] theaspect.livejournal.com
В log4j можно динамически менять настройки у логгеров

Date: 2014-12-03 10:58 pm (UTC)
From: [identity profile] aka-rider.livejournal.com
Задача интересная, но я сторонник того, чтобы инструментарий был максимально тупой, иначе прийдется и в нем баги вылавливать.

Можно сделать хуки на вход / выход из функции, только, не выдумывая ничего сложного, слать UDP сообщения.
У нас так и сделано, только расстановка макросов руками.
Грубо DBG(context, level, message), а потом этот level можно выставить для конкретного context в ран-тайм.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 24th, 2025 09:17 pm
Powered by Dreamwidth Studios