Использование gdb для распечатки значений в контрольных точках.
От: fk0 Россия  
Дата: 08.11.19 17:13
Оценка:
Hello...

Демонстрация концепции: 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 разделить на разные потоки, визуализировать и т.п.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.