我正在构建一个应用程序,该应用程序接受可执行文件作为输入,执行它,并跟踪动态内存分配等,以帮助跟踪内存错误。
在读取了可执行文件的名称之后,我创建了一个子进程,将可执行文件与我的模块(包括我的malloc函数族的版本)链接起来,并执行用户提供的可执行文件。父进程将由GUI (使用QT框架)组成,我希望在其中显示警告/错误/分配数量。
我需要将错误/释放的数量和一系列警告消息实时地传递给父进程。用户应用程序执行完毕后,我希望显示内存泄漏的数量。(我已经在链接所针对的共享库中处理了这方面所需的所有后端编码)。
实时:
我想出了两种不同的方法来传递这些信息。
信号版本和使用管道一样有效吗?这可行吗?还有更好的选择吗,因为我关心效率:)
用户的应用程序完成执行后:
我需要发送用于跟踪内存泄漏的整个数据结构。这可能非常大,所以我不确定哪种IPC方法最有效。
耽误您时间,实在对不起
发布于 2011-03-19 03:29:26
我建议将共享内存和套接字组合起来。有一个共享内存区域,例如1MB,并以某种标准格式在该缓冲区中记录所有信息。如果/当缓冲区填充或进程终止时,您将通过套接字向读取器发送消息。读取器ACK之后,您可以清除缓冲区并继续运行。
要回答caf对目标应用程序损坏的关切,只需使用护卫系统调用从共享内存区域删除权限(设置为PROT_NONE),然后才能控制目标进程。当然,这意味着您必须在更新每个分配的日志之前设置PROT_READ|PROT_WRITE,不确定这是否在mprotect调用中获得了性能上的胜利。
编辑:如果不是很明显,您可以有多个缓冲区(或一个分为N个部分),这样您就可以立即将控制传递回目标进程,而不是等待读取器到达ACK。另外,如果有足够的计算资源,读者可以按照自己的意愿运行,读取当前活动的缓冲区,并执行对用户的实时更新或任何它正在读取的内容。
发布于 2011-03-18 19:29:37
我建议使用unix域套接字,它比管道更灵活一些,可以配置为数据报模式,这样您就可以省去寻找消息边界,并且以后可以很容易地移动到网络接口。
发布于 2011-03-19 01:03:25
信号绝对不是这么做的方法。一般来说,只要有可能,最好避免发出信号。
管状溶液很好。您也可以使用共享内存,但这将更容易受到目标应用程序意外损坏的影响。
https://stackoverflow.com/questions/5356887
复制相似问题