5

我正在使用strace/监视一个进程,ltrace希望找到并拦截一个检查并可能激活某种全局共享锁的调用。

虽然我之前已经处理并阅读了 Linux 上几种形式的进程间锁定,但我对调用要查找的内容一无所知。

目前我唯一的怀疑是futex()在流程执行的早期出现。

更新0

我对自己的追求有些困惑。我正在监视现有进程以调用持久进程间内存或等效的 . 我想知道要查找的系统和库调用。我无意自己调用这些,所以自然futex()会出现,我相信很多库都会在这方面实现它们的锁定调用,等等。

更新1

我想要一个函数名称列表或文档链接,我应该在ltraceandstrace级别监视(并指定哪个)。任何其他关于如何跟踪和定位全局锁的好建议都会很棒。

4

4 回答 4

2

羊群是另一个好人

于 2010-02-08T02:48:31.777 回答
2

如果你可以在 valgrind 中启动被监控的进程,那么有两个项目:

http://code.google.com/p/data-race-test/wiki/ThreadSanitizer

和赫尔格林德

http://valgrind.org/docs/manual/hg-manual.html

Helgrind 了解所有 pthread 抽象,并尽可能准确地跟踪它们的效果。在 x86 和 amd64 平台上,它理解并部分处理因使用 LOCK 指令前缀而产生的隐式锁定。

因此,这个工具甚至可以检测到原子内存访问。他们会检查 pthread 的使用情况

于 2010-05-30T02:28:23.703 回答
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 的嵌入式系统上,您只能使用 system v (sysv) 信号量进行迭代进程通信。

upd1:必须检查任何 IPC 和 socker。

于 2010-02-10T18:14:00.970 回答
0
  1. 有许多系统调用可用于锁定:flock、fcntl,甚至 create。

  2. 当您使用 pthreads/sem_* 锁时,它们可能会在用户空间中执行,因此您永远不会在 strace 中看到它们,因为 futex 仅用于挂起的操作。就像您实际上需要等待时一样。

  3. 某些操作只能在用户空间中完成——比如自旋锁——除非它们为计时器做一些等待——否则你永远不会看到它们——退避,所以当一个锁等待另一个锁时,你可能只会看到诸如 nanosleep 之类的东西。

所以没有“通用”的方式来追踪它们。

于 2010-05-29T13:43:17.247 回答