是否可以调试英特尔 TSX?

Jae*_*Lee 4 debugging x86 assembly intel intel-tsx

我想利用 Intel TSX 来编写无锁代码。

xbegin
my_inst1
my_inst2
xend
Run Code Online (Sandbox Code Playgroud)

但是,由于某些原因,我在 TSX 执行 TSX 中的一条指令中止。

我想知道哪条指令产生了错误并使 TSX 中止。

有没有办法知道哪个指令产生了错误?

我的第一次尝试是在 TSX 区域中执行每条指令后增加全局计数器。但是,当故障发生时,对计数器的更新也会回滚,因为它会回滚 TSX 区域中的每次写入。

有什么技巧可以调试 TSX 执行吗?

Pet*_*des 5

使用perf record(或访问HW PERF的计数器的其他方式),用于像一个事件rtm_retired.aborted为任何中止,和/或tx_mem.abort_conflicttx_mem.abort_capacity以查看是否任一那些是用于中止原因。(您可以在一次运行中记录多个事件,然后查看哪个在 中触发perf report

tx_exec.misc1..3 也可能是相关的。从perf list我的 Skylake 桌面。

tx_exec.misc1
[计算可能导致事务中止的一类指令的执行次数。由于这是执行计数,因此它可能并不总是导致事务中止]

tx_exec.misc2
[计算可能导致事务中止的一类指令(例如,vzeroupper)在事务区域内执行的次数]

tx_exec.misc3
[统计指令执行导致支持的事务嵌套计数被超过的次数]

另见https://oprofile.sourceforge.io/docs/intel-skylake-events.php

对于不经常触发的事件,您可能需要进行调整以获得合理数量的样本。我没有试过这个,但希望计数应该出现在有罪指令本身。 rtm_retired.aborted是一个精确的事件;其他人在perf list输出中没有这么说。


一些 RTM/TSX 事件仅适用于 HLE(硬件锁定省略,您在locked 指令上添加一个额外的前缀)。

perf list在输出中使用并搜索“abort”以查找相关事件。