我正在使用PIN工具来跟踪运行SQL查询时的内存读写次数。但是,发生了一些奇怪的事pinatrace.out中的内存地址用于读/写我从运行中获取
./pin -t pinatrace.so -- /usr/local/pgsql/bin/psql postgres < tmp.sql
...不会与我从postgresql打印的内存地址重叠。
我在postgresql源代码中添加了几行来打印出一些虚拟指针的地址。它确实按照我的预期打印出日志中的内存地址,但是在“pinatrace.out”中找不到地址,其中包含将引脚附加到psql时已访问的所有内存地址。
但是,当我将虚拟指针的相同行打印地址复制到一个简单的test.c文件中并运行时
./pin -t pinatrace.so -- ./test
...屏幕输出中的地址可以在pinatrace.out中找到。
这两项测试均由postgres运行,因为我将PIN的所有者更改为postgres。
我真的很困惑。有人能够善意地指出发生了什么吗? postgres是否以不同方式分配内存,或者我可能错误地运行pin?任何想法都会有帮助!
如果您希望我进一步澄清这个问题,请告诉我。
答案 0 :(得分:1)
psql和postgresql服务器永远不会共享内存,即使它们作为同一个用户运行:所有通信都是通过套接字完成的。如果要研究服务器后端如何访问内存,则需要将跟踪器附加到后端进程,而不是psql。
当您使用psql连接时,会创建一个专用于该连接的新后端进程。所以你可以从那个psql中调用pg_backend_pid()
并找到要附加的进程ID,如果PIN工具支持它(例如像gdb那样)。