1

我在一个示例守护程序上运行了 valgrind。父进程在分配了 1000B 的块后退出,但在后台运行的子进程每两秒通过 malloc 在堆上分配 200B 的内存。

我的问题是:valgrind 是在实际处理器上还是在合成 CPU 上执行程序?

它是在实际堆上还是在不存在的合成 RAM 上分配内存?

因为我让程序运行了相当长的时间,以至于孩子在堆上分配了一些 2GB 的内存。在 massif 上实现程序时,我得到了一个父级的输出文件,而在终止守护进程时,我得到了另一个 massif.out。对于显示堆上内存分配的孩子。

4

2 回答 2

1

Valgrind 在自己的合成 CPU 中运行程序,程序机器码没有任何东西到达主机 CPU。

内存分配与 Memcheck 挂钩,如果你使用它,否则 Valgrind 调用 libc 内存分配例程。

事实上,这一事实可能会使系统服务的 Valgrind 调试复杂化。

于 2012-10-11T10:05:04.617 回答
0

如果你打开 memcheck(这是默认设置),那么 Valgrind 将管理堆,即所有与内存相关的方法(malloc/free/memmove 等)都将替换为 Valgrind 版本的相应方法。

如前所述,您的程序运行在由 valgrind 创建和管理的虚拟 CPU 上。

据我所知,没有合成 RAM 的概念。在任何情况下,所有这些对于正在运行的进程(你的守护进程)都是非常透明的,并且不应该以任何方式改变你的程序的行为。

因此,合成 CPU 的答案是肯定的,合成 RAM 的答案是否定的。

于 2012-10-11T11:49:48.783 回答