我正在构建一个应用程序,它可以输入可执行文件,执行它并跟踪动态内存分配以帮助跟踪内存错误。
在读取可执行文件的名称后,我创建了一个子进程,将可执行文件与我的模块(包括我的malloc系列函数)链接,并执行用户提供的可执行文件。父进程将包含一个GUI(使用QT框架),我想在其中显示警告/错误/分配数量。
我需要实时向父进程传达mallocs / frees的数量和一系列警告消息。用户应用程序完成执行后,我希望显示内存泄漏的数量。 (我已经在我链接的共享库中处理了所需的所有后端编码)。
实时:
我虽然有两种不同的方法来传达这些信息。
信号版本是否与使用管道一样高效?这可行吗?有没有更好的选择,因为我关心效率:)
用户申请完成后执行:
我需要发送我用来跟踪内存泄漏的整个数据结构。这可能非常大,所以我不确定哪种IPC方法效率最高。
感谢您的时间
答案 0 :(得分:3)
我建议使用一个unix-domain套接字,它比管道更灵活,可以配置为数据报模式,这样可以节省你必须找到的消息边界,并且以后可以很容易地移动到网络接口。
答案 1 :(得分:2)
信号肯定不是这样做的方式。通常,尽可能避免使用信号。
管道解决方案很好。您也可以使用共享内存,但这会更容易受到目标应用程序意外损坏的影响。
答案 2 :(得分:1)
我建议共享内存和套接字的组合。有一个共享内存区域,比如1MB,并在该缓冲区中以某种标准格式记录所有信息。如果/当缓冲区填满或进程终止时,您通过套接字向阅读器发送消息。读者确认后,您可以清除缓冲区并继续。
要回答caf对目标应用程序损坏的担忧,只需使用mprotect系统调用从共享内存区域中删除权限(设置PROT_NONE
),然后再将控制权交给目标进程。当然,这意味着您必须在更新每个分配的日志之前设置PROT_READ|PROT_WRITE
,不确定这是否是在引发mprotect
次调用时的性能获胜。
编辑:如果它不是很明显,你可以有多个缓冲区(或者一个分为N个部分),这样你就可以立即将控制权传递给目标进程,而不是等待读者确认。此外,如果有足够的计算资源,读者可以按需读取当前活动的缓冲区并对用户或其正在读取的任何内容执行实时更新。