我正在使用一个大型的嵌入式代码库,并使Linux可执行文件(作为模拟)。该软件可直接访问FPGA上的内存映射寄存器,并且由于各种原因,目前尚无法实现抽象层。取而代之的是,我在“ 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对段错误的处理设置为通过,不间断,不打印,并且效果很好。问题出在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次。
有两个问题:
是否有任何方法可以在每次调用时停止捕捉点处理打印?
是否有任何方法可以改善陷阱处理,从而使陷阱继续并且步骤不需要重复输入?