我正在修补PostgreSQL补丁中的问题,其中共享内存中的单词似乎无意中被覆盖。
Valgrind没有任何帮助,因为它无法跟踪多个进程之间共享内存中的交互。
被覆盖的地址相当稳定,但并不是完全固定的,尽管它始终由每个进程在启动早期初始化的全局结构中的指针标识。
我试图找到一种方法来获取堆栈跟踪,只要任何进程写入感兴趣的地址,但它证明比我预期的更难。
gdb
观察点没有任何帮助,因为gdb无法跟踪fork()
并在子进程上建立相同的监视。由于PostgreSQL使用的子进程数量以及手动设置的时间问题,手动执行多个gdb进程非常麻烦。
perf
用户空间探测看起来很有前景,但似乎只附加到函数,没有明显的方法来捕获对内存地址的写入。
那么有没有办法将每个编写器的堆栈跟踪抓取到多个进程的给定共享内存地址?