我试图在我的代码中找到锁争用,我在标准systemtap版本中找到了futexes.stp。但我对输出有几个问题:
stap -d /usr/local/bin/cruncher ~/futexes.stp
(and then I run cruncher application in another term)
auditd[1803] lock 0x564dd507f228 contended 2 times, 119 avg us
auditd[1803] lock 0x564dd507f254 contended 28 times, 458040 avg us
rs:main Q:Reg[1837] lock 0x5563b67c2044 contended 7 times, 2352067 avg us
...
cruncher[17021] lock 0x7f6c9c57914c contended 2 times, 46 avg us
cruncher[17021] lock 0x7eff50 contended 82 times, 16 avg us
cruncher[17021] lock 0x7f6c40901f24 contended 20 times, 109 avg us
cruncher[17021] lock 0x7f6f38e0633c contended 4471 times, 2106 avg us
cruncher[17021] lock 0x7dae7c0 contended 8861 times, 26 avg us
cruncher[17021] lock 0x7f6cc2f14560 contended 2 times, 9 avg us
cruncher[17021] lock 0x7f6c8685d024 contended 5 times, 95 avg us
cruncher[17021] lock 0x7f6cd9e2ded4 contended 6 times, 428 avg us
cruncher[17021] lock 0x7f6c5196937c contended 44 times, 484 avg us
cruncher[17021] lock 0x7f6ba20c0290 contended 4 times, 8 avg us
...
以下是问题:
所有这些构造有0x7f ..........堆栈地址?我确信它不是来自我的申请。那些库或内核互斥(或condvars)代表我的应用程序吗?我如何验证?
那些"锁定"我的地址很短。我可以使用gdb""信息符号"来验证它们。命令,但是从stap到自动将其解码为符号的好方法是什么?
我正在使用基于同一个盒子的Linux 4.6.2主线内核,以及来自他们的git存储库的最新systemtap。我的cruncher应用程序是用-g构建的,符号没有被剥离。
提前多多感谢!
答案 0 :(得分:0)
lock 0x7f...
地址是传递给futex(2)
系统调用的用户空间指针。脚本只是逐字存储它们。它们很可能指向glibc pthreads-mutex类型对象的内部。
关于哪个对象......必须添加地址到符号的查找阶段。它可能通过拦截pthread互斥量初始化与另一个探针来组装一个pthread锁表来完成。或者通过向传入的futex地址添加usymdata(...)
个查找。有关这两种技术的使用,请参阅mutex-contention.stp
示例脚本。