fk0легенда (08.11.2019 20:14, просмотров: 1663)
Использование gdb для распечатки значений в контрольных точках. Демонстрация концепции по ссылке. https://coliru.stacked-crooked.com/a/74f94619df56b6bf
См. внимательно командную строку. Идея в том, что можно не делать некий "логгер" и не добавлять его в рантайм. Можно расставить в исходном коде некие аннотации, на основании которых отладчик получит возможность расставить в нужных местах точки останова и выполнить в этих точках заданные программистом действия (распечатать значения переменных). Перекомпиляция при этом не требуется, как и модификация кода программы.
Что очень хотелось бы, но непонятно как реализовать:
1) распечатка таймштампа в каждой строке (gdb умеет в каких-то непонятных случаях его печатать, но видимо в данном случае никак) без модификации кода (с нацелом на использование в embedded, где функций ОС может не быть);
2) распечатка переменных оптимизированных компилятором: из-за этого нужно добавлять -O1 и перекомпилировать, потенциально может быть решено через макросы изменяющие код (присваивающие переменные другим, временным, но для чего так же нужен typeof() от gcc);
3) распечатка имени функции (класса) -- видимо, невозможно без модификации кода;
4) ассерты проверяемые на стороне отладчика (break __FILE__:__LINE__ if confition...) -- вроде всё просто;
5) сохранение значений переменных, захваченных в определённой точке программы, в отдельный файл (сейчас, потенциально, их можно достать из вывода gdb, но при обработке аудио-файлов, например, это гигантские объёмы данных);
6) заданные пользователем функции распечатки сложных классов (структур), заданные на стороне gdb -- непонятно как сделать без инжекции кода в момент исполнения (опять же можно парсить вывод gdb...)
Может можно как-то использовать gdb с питоном? Или таймштампы проставить уже на выводе gdb (перенаправленном в свою программу). Последнее кажется осмысленной идеей. Там же можно вывод gdb разделить на разные потоки, визуализировать и т.п.
[ZX]