SPARC单步调试模式

3

是否有与x86的单步模式相当的SPARC模式?我希望在每个指令执行后停止执行并将控制流移动到陷阱处理程序或类似的东西。

我考虑使用延迟执行槽中的ta指令,但如果前一条指令是设置了annul位的分支指令,则无法正常工作。


我认为你应该通过解码指令并查看保存的NPC寄存器值来替换Tcc指令并处理延迟槽。 - Ross Ridge
1个回答

1
Sparc在PSR中缺少单步位,因此单步更加困难。但我使用了一个技巧来帮助接近解决。将TPC设置为要单步的指令地址,并将TNPC设置为其他地方的地址,您可以在其中放置一个陷阱指令。当您执行重试指令以返回进程上下文时,它将单步执行您想要的一个指令,然后它将接着执行陷阱指令,这将使您立即回到内核,从而可以进行任何操作。(注意:这适用于sparc64,不确定sparc32是否适用)。这是一个不错的技巧,因为您不必修改用户地址空间中的现有指令。这对我很重要,因为我正在内核中单步执行指令。
我还有另一个想法,但从未尝试过,那就是简单地将TNPC设置为非法地址。然后,在执行TPC处的指令后,您将自动陷入内核。由于陷阱处理代码知道进程正在被单步执行,因此不会混淆“真正”的非法地址陷阱。

除非第一条指令是跳转到非法地址(在有错误的程序中)。也许您可以选择非法地址,以便这种情况不会发生,至少不会使用相对跳转,但是假定寄存器间接跳转可以带您到任何地方。(我不知道SPARC细节是否真正关注此事,或者陷阱处理程序是否具有足够的信息来解决此问题。) - Peter Cordes
我可以想到几种处理这个问题的方法。首先,您可以阅读即将单步执行的指令,看看它是否是寄存器间接跳转,并对其进行解码以查找源寄存器和任何偏移量,然后计算跳转目标并保存以与非法地址陷阱后的TPC值进行比较。第二,只需将我们放入TNPC中的非法地址视为元数据;用伪随机数填充它,然后确认故障的非法地址是否相同。如果不是,则非法地址是由单步执行的指令引起的,而不是由我们的地址引起的。 - Rob Gardner
这两种方法听起来都很繁琐。依靠偶然性,即您没有生成与目标代码跳转到的相同地址可能是安全的(特别是使用64位地址),但最好能够做一些保证安全的事情。将TNPC指向一个陷阱指令可以避免所有这些问题吗? 这似乎是明显的选择。 - Peter Cordes
1
当然,安全的做法是将TNPC指向陷阱指令。所有这些其他的谈话只是为了好玩,我从未尝试过。我想到了一种简单的方法来检测用户生成的非法地址和我们生成的地址之间的差异:在非法地址后的陷阱处理程序中,查看TNPC。如果它与陷阱之前相同,则意味着步进指令出现故障。 - Rob Gardner
整洁,也许将其编辑进你的回答中。顺便说一句,我主要只了解x86,但对其他指令集架构的设计有一些了解。对于其他机器的ISA调试支持,特别是带有分支延迟槽的支持,是很有趣的。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接