我正在使用strace
/ ltrace
监控流程,希望查找并拦截一个检查并可能激活某种全局共享锁的调用。
虽然之前我曾在Linux上处理和阅读过几种形式的进程间锁定,但我还是要查找要查找的内容。
目前我唯一的嫌疑人是futex()
,它在执行过程中很早就出现了。
对于我所追求的事情存在一些困惑。我监控调用持久进程间内存或等效的现有进程。我想知道要查找的系统和库调用。我无意自称这些,所以很自然futex()
会出现,我相信很多库会根据这个来实现锁定调用等。
我想要一个功能名称列表或文档链接,我应该在ltrace
和strace
级别监控(并指定哪个级别)。关于如何跟踪和定位全局锁定的任何其他好建议都会很棒。
答案 0 :(得分:2)
flock是另一个好人
答案 1 :(得分:2)
如果您可以在valgrind中启动受监视的进程,那么有两个项目:
http://code.google.com/p/data-race-test/wiki/ThreadSanitizer
和Helgrind
http://valgrind.org/docs/manual/hg-manual.html
Helgrind知道所有的pthread 抽象和跟踪他们的影响 尽可能准确。在x86和 amd64平台,它理解和 部分处理隐式锁定 因使用LOCK而产生 指令前缀。
因此,这些工具甚至可以检测原子内存访问。他们将检查pthread使用情况
答案 2 :(得分:0)
在glibc~> = 2.5(glibc + nptl)的系统上你可以使用进程共享
semaphores (last parameter to sem_init), more precisely, posix unnamed semaphores
posix mutexes (with PTHREAD_PROCESS_SHARED to pthread_mutexattr_setpshared)
posix named semaphores (got from sem_open/sem_unlink)
system v (sysv) semaphores: semget, semop
在使用glibc 2.2,2.3使用linuxthreads的旧系统上或在使用uClibc的嵌入式系统上,只能使用系统v(sysv)信号量进行iterprocess通信。
upd1:必须检查任何IPC和socker。
答案 3 :(得分:0)
有许多系统调用可用于锁定:flock,fcntl,甚至是create。
当您使用pthreads / sem_ *锁时,它们可能会在用户空间中执行,因此您永远不会 在strace中看到它们,因为只有挂起操作才会调用futex。就像你真的一样 需要等待。
有些操作只能在用户空间中完成 - 比如自旋锁 - 你永远不会看到它们 除非他们做一些等待计时器 - 退避,所以当一个锁等待其他时,你可能只会看到像nanosleep这样的东西。
因此没有“通用”方式来追踪它们。