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