我正在将Ubuntu 18.04与glibc-2.27
一起使用,这是在其中部署tcache
重新分配系统的发行版。当使用gdb
+ gef
(又名GDB Enhanced Features)调试某些图像时,我注意到tcache
bin与竞技场关联。
通用heap bins
命令输出如下所示:
gef➤ heap bins
───────────── Tcachebins for arena 0x7ffff7dcfc40 ───────────────────────────────────────────────────────────────────────────────────────
Tcachebins[idx=0, size=0x10] count=1 ← Chunk(addr=0x555555756260, size=0x20, flags=PREV_INUSE)
正如从输出中可以看出的,tcache
分箱与一个竞技场相关联。这对我来说似乎很奇怪,因为tcache
的整个思想(至少是我得到它的方式)是为了避免由于锁定竞技场而导致线程之间的竞争。
我在glibc Wiki上对Malloc Internals进行了一些研究,发现了我已经知道的内容:
[每个线程都有一个每个线程的缓存(称为tcache),其中包含一小部分块,可以在不需要锁定舞台的情况下对其进行访问。
所以,竞技场和tcache
箱之间是什么关系?如果我可以在不锁定竞技场的情况下访问tcache
,为什么gef
打印一个竞技场(地址)?感谢您的澄清!
这似乎是GDB插件中的演示文稿问题。 tcache的实例与线程而不是竞技场关联。一个tcache实例可以包含来自多个不同领域的分配,而不仅仅是当前与tcache所属线程关联的领域。