v3.*_*v3. 6 c linux memory-management sandbox
我在Ubuntu上用C运行一种"沙盒":它需要一个程序,并在用户下安全地运行它nobody(并拦截信号等).此外,它还分配内存和时间限制,并测量时间和内存使用情况.
(如果你很好奇,那就是为了在测试数据上标记程序的某种"在线判断")
目前,我已经适应了safeexec从模块mooshak.虽然大多数东西都能正常工作,但内存使用似乎是一个问题.(这是非常不准确的)
现在我已经尝试了这里的建议并解析了VM /proc/pid/stat,现在修复了准确性问题.但是,对于快速完成的程序,它不起作用,只返回0.
该safeexec程序看起来像这样的工作:
fork()ŝexecv()在子进程来运行所需的程序wait4,这恰好返回CPU使用情况 - 但不是内存?)/proc/../stat子进程(已被execv替换)那么为什么VM /proc/child_pid/stat有时等于0?
是因为execv()完成得太快,而且/proc/child_pid/stat只是不可用?
如果是这样,是否有某种其他方式来获取孩子的内存使用情况?
(因为这是为了在一个时间限制内判断程序,我承担不起像valgrind这样的性能损失的东西)
提前致谢.
您能否安排子进程使用您自己的malloc()et al 版本并记录 HWM 内存使用情况(也许使用注册的处理程序atexit())?也许您会使用 LD_PRELOAD 来加载内存管理库。这对于巨大的静态数组或巨大的自动数组没有帮助。
嗯,听起来很有趣。有什么方法可以跟踪静态/自动数组吗?
静态内存可以使用“size”命令进行分析 - 或多或少。
自动数组是一个问题 - 我不确定你如何处理这些。您的内存分配代码可以在调用时查看正在使用多少堆栈(查看局部变量的地址)。但不能保证在使用最大数量的本地数组时会分配内存,因此它最多只能提供一个粗略的测量值。
另一种想法是:也许您可以使用调试器技术(ptrace()系统调用)来控制子进程,特别是让它保持足够长的时间,以便能够从/proc/....