松弛内存模型上的断点行为

郑大河
Init: int x = y = 0;

thr1       thr2
----       ----
y = 1;     x = 1;    WRITE to global variables
a = x;     b = y;    READ from global variables
print(a);  print(b);

在上面以TSO内存模型运行的代码段中,众所周知,两个线程都可以同时打印0,因为CPU可以在指令执行之前对命令进行重新排序以执行读取指令(即线程的第二行)。写指令。

然后,将发生什么事情,我们在读取指令上插入了断点,而在命中断点时却继续执行,除了执行任何操作外,什么都不做?两个线程仍然可以同时打印0,还是断点阻止了重新排序?

我假设使用x86-64体系结构和x86-TSO内存模型。但是,如果给出架构(或存储器模型)之间的任何区别,将是可以理解的。另外,我猜硬件断点和软件断点不会在结果上有所不同(因为它们都触发异常,并且x86体系结构以类似方式处理它们)。这个猜测正确吗?

彼得·科德斯

对于与https://preshing.com/20120515/memory-reordering-caught-in-the-act/相同的情况,我假设这是汇编的伪代码(不是C,可能会发生大量编译时优化)StoreLoad重新排序的位置将可见。

带有断点处理程序的断点可以立即返回,这只是序列化指令(如CPUID或IRET)的一种非常昂贵的选择,该序列化指令可确保所有先前的指令均已执行,并且所有先前的存储都将提交给相干缓存(即清空存储缓冲区)。

原因是从断点返回可能涉及IRET,这一个序列化指令。(就像MFENCE一样,还可以序列化无序的exec)。

所以是的,断点是其他线程观察到的内存重新排序的全部障碍。

这适用于硬件断点或软件断点,其中调试器必须还原原始指令的第一个字节以使其能够正常执行,而不是0xcc int3软件断点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Windbg pykd 内存断点

来自分类Dev

Mac OS X上的LLDB:在执行内存时设置断点

来自分类Dev

Netbeans PHP断点的奇怪行为

来自分类Dev

CakePHP在插件上未加载相关模型的行为

来自分类Dev

内存模型,负载获取语义实际上如何工作?

来自分类Dev

使用断点的Monotouch怪异行为

来自分类Dev

蚀调试模式断点奇怪的行为

来自分类Dev

硬件断点能够写入内存吗?

来自分类Dev

在删除内存C ++时触发断点

来自分类Dev

AngularJS奇怪的行为与模型

来自分类Dev

Laravel 模型奇怪的行为

来自分类Dev

了解python的内存模型

来自分类Dev

POSIX共享内存模型

来自分类Dev

内存模型和并发

来自分类Dev

Python:内存模型 ID

来自分类Dev

模型中的Rails代码在开发与生产上的行为方式不同

来自分类Dev

混乱的内存重新排序行为

来自分类Dev

奇怪的内存行为处理TSV

来自分类Dev

应用程序内存行为

来自分类Dev

Selenium Chrome Driver 在 junit 中带断点和不带断点的不同行为

来自分类Dev

Eclipse调试器-断点意外行为

来自分类Dev

Visual Studio 2005 中断点时的奇怪行为

来自分类Dev

灰烬模型渲染奇怪的行为

来自分类Dev

Mongoose 模型对象行为异常

来自分类Dev

根据内存中的值在lldb中设置条件断点?

来自分类Dev

main()中的GDB断点无法访问内存

来自分类Dev

了解“平面内存模型”和“分段内存模型”

来自分类Dev

高堆栈帧上的条件断点

来自分类Dev

在Xcode的断点上使用说命令