LINUX.ORG.RU

Пошаговая отладка realtime программ (остановить время).


0

1

Есть, например, программа в которой, например, используется активно clock_gettime(CLOCK_MONOTONIC) и алгоритмы в целом привязаны к реальному времени. На самом деле на микроконтроллере такие программы останавливать можно, останавливая и счётчик времени. Работа конечно не правильная, но для отладки приемлемо. Бывает хочется остановить в gdb и посмотреть переменные, ещё что-то поделать... Брейкпоинты поставить... Проблема понятно в чём. Пока в gdb стоит часы идут. И после continue всё глючит (часы далеко вперёд убежали). Хотелось бы останавливать часы, пока процесс остановлен. Как?

Единственное что приходит в голову: завернуть clock_gettime в свою функцию, которая к результату clock_gettime будет добавлять некую поправку хранимую в переменной clock_offset, например. Вместо continue (в gdb) написать define mycontinue — макрос считывающий текущиее значение clock_gettime, вычитающий значение когда остановились, clock_laststopped, и сохраняющий в clock_offset. Далее, написать для gdb опять же commands... чтоб при остановке сохранял в clock_laststopped текущее значение clock_gettime. Как-то сложно и не до конца определённо.


завернуть clock_gettime в свою функцию

единственно правильное и верное решение.

nanoolinux ★★★★ ()

ну и, наверное, правильнее будет ориентироваться не на глобальное время а на дельту времени (от последнего пересчета), которой уже манипулировать

хотя может херню сморозил, в играх так делал

trashymichael ★★★ ()
Последнее исправление: trashymichael (всего исправлений: 1)

а может тебе всеголишь нужно стартануть свое приложение под каким нибуть трейсером а потом изучить логи? На ARM-e например пожно попытатся использовать ETM.

cvv ★★★★★ ()
Ответ на: комментарий от cvv

Не совсем так. Иногда хочется и поменять переменную и т.п.

А трейсер — это отдельный интересный вопрос. Что можно использовать в качестве трейсера? gdb в теории умеет. Но на примере hello world это только и получается, да и то... не разобрался толком. Речь про x86 с обычным линуксом. С микроконтроллерами бывает периферию остановить можно — всё проще.

fk0 ()

не привязанные в вводу/выводу части можно отдельно отлаживать заменив MONOTONIC на CLOCK_PROCESS_CPUTIME_ID.

MKuznetsov ★★★★★ ()

первый глюк ты уже нашел ;) у тебя программа при неправильном времени глючит.

invy ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.