Hexagon GDB Debugger介绍(15)
2.9.3 中断
中断是由硬件或软件触发的异步处理器事件。 它们通常会导致处理器分支到称为中断向量的相关内存地址。 中断由唯一编号标识。 Hexagon 处理器支持 32 个中断,编号为 0-31。
调试器能够模拟单个中断或一系列周期性中断的发生。
set interrupt intnumber [delay] [period]
产生指定中断号的中断。
延迟指定在中断发生之前必须执行的周期数。 默认延迟为 0。
period 指定将使用指定的(非零)周期间隔生成一系列周期性中断。 默认周期为 0。
reset-interrupt intnumber [periodic|pin|both]
重置指定中断的状态。
periodic 禁用在指定中断号上生成的一系列周期性中断。
pin 清除指定中断号上的任何挂起中断。
both 执行periodic和pin命令(默认)。
info interrupt-map
显示中断类型列表及其分配的中断向量。
remap intname intnumber
将中断类型重新映射到指定的中断号。
可以通过以下过程在周期性中断上间接设置回调:
- 获取当前周期数(2.9.1.2节)
- 计算触发中断的周期数
- 在循环计数上设置周期性观察点(第 2.9.1.2 节)
- 在观察点上设置回调(第 2.9.1.7 节)
2.9.4 停止和启动多线程程序
如果你的程序使用多个线程(第 2.8.8 节),可以选择是在所有线程上还是在特定线程上设置断点。
break linespec thread threadno
break linespec thread threadno if …
linespec 指定源代码行; 有几种编写它们的方法,但效果总是指定一些源代码行。
使用带有断点命令的限定符线程 threadno 来指定只希望调试器在特定线程到达此断点时停止程序。 threadno 是调试器分配的数字线程标识符之一,显示在信息线程显示的第一列中。
如果在设置断点时不指定线程 threadno,则断点适用于程序的所有线程。
也可以在条件断点上使用线程限定符; 在这种情况下,将线程 threadno 放在断点条件之前,如下所示:(hexagon-gdb) break frik.c:13 thread 28 if bartab > lim
每当程序因任何原因在调试器下停止时,所有执行线程都会停止,而不仅仅是当前线程。 这使您可以检查程序的整体状态,包括线程之间的切换,而不必担心事情可能会发生变化。
有一个不幸的副作用。 如果一个线程因断点或其他原因而停止,而另一个线程在系统调用中被阻塞,则系统调用可能会过早返回。 这是多个线程与调试器用来实现断点和其他停止执行事件的信号之间交互的结果。
为了处理这个问题,你的程序应该检查每个系统调用的返回值并做出适当的反应。 这是很好的编程风格。
例如,不要写这样的代码:
sleep (10);
如果不同的线程在断点处或由于某些其他原因停止,则对 sleep 的调用将提前返回。
相反,写这个:
int unslept = 10;
while (unslept > 0)
unslept = sleep (unslept);
允许系统调用提前返回,因此系统仍然符合其规范。 但是调试器确实会导致你的多线程程序的行为与没有调试器时的行为不同。
此外,调试器使用线程库中的内部断点来监视某些事件,例如线程创建和线程销毁。 当这样的事件发生时,另一个线程中的系统调用可能会提前返回,即使您的程序似乎没有停止。
相反,每当重新启动程序时,所有线程都开始执行。 即使使用 step 或 next 等命令单步执行也是如此。
特别是,调试器不能在锁步中单步执行所有线程。 由于线程调度取决于调试目标的操作系统(即不受调试器控制),因此当当前线程完成单个步骤时,其他线程可能会执行多个语句。 此外,通常其他线程在程序停止时停止在语句中间而不是在干净的语句边界处。
甚至可能会发现程序在continuing甚至single-stepping执行后停止在另一个线程中。 每当其他线程在第一个线程完成请求的任何内容之前遇到断点或异常时,就会发生这种情况。
在某些操作系统上,可以锁定操作系统调度程序,从而只允许一个线程运行。
set scheduler-locking mode
设置调度器锁定模式。 如果关闭,则没有锁定,任何线程都可以随时运行。 如果打开,则当低级线程恢复时,只有当前线程可以运行。 step模式针对单步执行进行了优化。 它通过在你step时抢占当前线程来阻止其他线程“抢占提示”。 其他线程在你step时很少(或永远不会)有机会运行。 它们更有可能在你下次调用函数时运行,并且当你使用 continue、until 或 finish 等命令时,它们可以完全自由地运行。 但是,除非另一个线程在其时间片内遇到断点,否则它们永远不会从你正在调试的线程中窃取调试器提示。
show scheduler-locking
显示当前调度程序锁定模式。