C 共享内存中的观察点?

C 共享内存中的观察点?,c,gdb,shared-memory,trace,watchpoint,C,Gdb,Shared Memory,Trace,Watchpoint,我正在调试PostgreSQL补丁中的一个问题,其中共享内存中的一个单词似乎被无意中覆盖了 Valgrind没有任何帮助,因为它无法跟踪多个进程之间共享内存中的交互 被覆盖的地址相当稳定,但不是完全固定的,尽管它总是由每个进程在启动早期初始化的全局结构中的指针标识 我试图找到一种方法,在任何进程写入感兴趣的地址时获取堆栈跟踪,但事实证明,这比我预期的要困难得多 gdb监视点没有任何帮助,因为gdb无法遵循fork()并在子进程上建立相同的监视。由于PostgreSQL使用的子进程的数量以及手动设

我正在调试PostgreSQL补丁中的一个问题,其中共享内存中的一个单词似乎被无意中覆盖了

Valgrind没有任何帮助,因为它无法跟踪多个进程之间共享内存中的交互

被覆盖的地址相当稳定,但不是完全固定的,尽管它总是由每个进程在启动早期初始化的全局结构中的指针标识

我试图找到一种方法,在任何进程写入感兴趣的地址时获取堆栈跟踪,但事实证明,这比我预期的要困难得多

gdb
监视点没有任何帮助,因为gdb无法遵循
fork()
并在子进程上建立相同的监视。由于PostgreSQL使用的子进程的数量以及手动设置所涉及的时间问题,因此手动使用多个gdb进程非常麻烦

perf
用户空间探测看起来很有希望,但似乎只附加到函数,没有明显的方法来捕获对内存地址的写入

那么,有没有办法跨多个进程获取每个写入程序到给定共享内存地址的堆栈跟踪

gdb无法遵循fork()并在子进程上建立相同的监视


一个足够新的GDB可以做到这一点。文档和。

感谢您提供了非常有用的指针。我以为我已经回答过了,但显然没有。具体来说,
计划多个on
分离on-fork-off
执行此技巧。断点、观察点等由正在调试的所有子进程继承。非常令人印象深刻。也非常非常方便。我遇到的唯一问题是。我上了飞机。回到本主题,非停止模式和多个计划非常有用。您还需要
设置打印符号加载