Я беру большую встроенную кодовую базу и делаю исполняемый файл linux (в качестве симуляции).Это программное обеспечение содержит множество прямых обращений к отображенному в памяти регистру на ПЛИС, и по разным причинам в настоящее время не представляется возможным реализовать уровень абстракции.Вместо этого я использую обработчик ошибок сегмента плюс одношаговый процессор и обработчик ловушек плюс отображаемую память в области «FPGA».Последовательность:
Segfault
Unprotect mapped memory.
Read simulation (i.e. insert values into the target area)
Set the target "trap" (single-step) flag
Set the "inSimulation" flag
Return
Trap
Clear the "inSimulation" flag
Write simulation (i.e. respond to written value)
Clear the target "trap" flag
Re-protect the mapped memory
Return
Это хорошо работает и позволяет мне моделировать все, что мне нужно.
Проблема в том, что GDB работает хорошо при отладке этого кода.
Я установил в GDB обработку segfault: pass, nostop, noprint, и это хорошо работает.Проблема в сигнале TRAP, который использует GDB, а также в пошаговом использовании процессора.Я справляюсь с этим, устанавливая точку перехвата, которая использует флаг программы inSimulation (не gdb), чтобы определить, следует ли пересылать сигнал тестируемой программе.
Вот мой текущий .gdbinit:
set pagination off
handle SIGSEGV nostop noprint
catch signal SIGTRAP
commands
if inSimulation
signal SIGTRAP
end
end
Я бы хотел, чтобы GDB «чувствовал» то же самое при отладке этой симуляции, как и при отладке любой другой программы.Вместо этого есть много шума от обработки точки перехвата, продолжить, чтобы вступить в силу, необходимо ввести продолжения, затем необходимо ввести переменное число раз, иногда только один раз, но иногда 4 или даже (возможно) 6.
Итак, два вопроса:
Есть ли способ остановить обработку точек захвата при каждом вызове?
Есть ли способ улучшить обработку ловушек, чтобы продолжить, а шаги неТребуются повторные записи?