我在 Ubuntu 上用 C 语言运行一种“沙箱”:它需要一个程序,并在用户 nobody
下安全地运行它(并拦截信号等)。此外,它还分配内存和时间限制,并测量时间和内存使用情况。
(如果你好奇,这是一种“在线法官”在测试数据上标记程序)
目前我已经从mooshak 改编了safeexec 模块。 .虽然大多数事情都可以正常工作,但内存使用似乎是个问题。 (这是非常不准确的)
现在我已经尝试了建议 here并从/proc/pid/stat
解析VM,现在精度问题已修复。然而,对于真正快速完成的程序来说,它不起作用,只会返回 0。
safeexec 程序似乎是这样工作的:
- 它
fork()
- 在子进程中使用
execv()
来运行想要的程序 - 从父进程监视程序,直到子进程终止(使用
wait4
,这恰好返回 CPU 使用率 - 但不是内存?)
所以它解析子进程的/proc/../stat
(已经被execv取代)
那么为什么 /proc/child_pid/stat
中的 VM 有时等于 0?
是不是因为 execv() 完成得太快,/proc/child_pid/stat
不可用?
如果是这样,是否有某种其他方式来获取 child 的内存使用情况?
(因为这是为了在时间限制下判断程序,所以我不能承受像 valgrind 这样的性能损失)
提前致谢。
最佳答案
您能否安排子进程使用您自己的 malloc()
等版本,并记录 HWM 内存使用情况(也许使用在 atexit()< 注册的处理程序
)?也许您会使用 LD_PRELOAD 来加载您的内存管理库。这对庞大的静态数组或庞大的自动数组没有帮助。
Hmm, sounds interesting. Any way to track the static/automatic arrays, though?
可以使用“大小”命令分析静态内存 - 或多或少。
自动数组是个问题 - 我不确定您如何处理这些问题。您的内存分配代码可以查看调用时使用了多少堆栈(查看局部变量的地址)。但是不能保证在使用最大数量的本地数组时会分配内存,因此它最多只能提供一个粗略的衡量标准。
另一个想法:也许您可以使用调试器技术 - ptrace()
系统调用 - 来控制子进程,特别是将其保持足够长的时间以便能够收集来自 /proc/...
的内存使用统计信息。
关于c - 子进程的内存使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/743955/