以下是对我的问题的简短描述:
上下文:
硬件: Toradex VF61
分布: Angstrom v2014.12
内核版本:4.0.2v2
软件语言: Qt/C++
问题:我开发了一个至少需要在嵌入式产品上运行2周的应用程序。我的问题是,我的进程运行了5天,有一个小内存泄漏,我监视它的“顶”,然后它被杀死。正如托普告诉我的,我的过程变成了僵尸。
尝试1:我尝试用纠正内存泄漏,但是有些“可能”泄漏在我在程序中使用的库中(很多是malloc)。这是一个很大的工作,以了解所有的轻巧,这不是目标。
我认为内存泄漏大约是每天失忆的1%,所以在2周内丢失了15%。这种泄漏对我来说是可以接受的,因为这个进程在两周后不会运行,而嵌入式系统专门用于这个进程,我在机器上没有任何其他的大进程在运行。RAM监测显示,这一过程需要30%的资源,因此两周后估计为45%。
尝试2 :我询问了Linux下的内存管理,并了解了OOM-Killer。我推断OOM-Killer可能觉得我的进程在内存泄漏的情况下运行得太久了,于是就把它杀死了。因此,我将进程的变量"oom_score_adj“设置为-1000,以防止OOM-Killer杀死我的进程,并再次尝试在内存泄漏的情况下运行很长时间。但这一次,我的过程变成了“沉睡”,没有死亡,但无法使用。休眠状态与错误消息“./app‘中的错误: malloc():内存损坏(快速):0x72518ddf”相关联。我精确地指出,我的代码中有零malloc,仅在我使用的librairies中。
问题:
你认为像OOM-Killer这样的进程会不会因为我的内存泄漏和我的程序已经运行了很长时间而把我的进程变成僵尸?
您认为Linux是否可能将我的进程转换为休眠模式,因为泄漏已经填满了分配给进程的内存?
发布于 2018-08-30 12:33:14
关于您的第一个问题,OOM杀手将在oom_score之后杀死一个或多个进程(内存消耗高,对系统不太重要,.)在系统内存非常少的情况下。因此,如果OOM杀手杀死了您的主进程的子进程,这将使您的主进程变成僵尸。
对于第二个问题,Linux将进程置于休眠状态,如果这个特定进程的资源不可用。但是在您的情况下,如果存在内存泄漏,并且进程消耗了大量内存,那么这个进程就会被扼杀,然后进入休眠状态。
您的应用程序是否使用了UART?
顺便说一句,还有一个Toradex社区,工程师可以直接回答你的问题。
向你问好,贾斯基
https://stackoverflow.com/questions/52006503
复制相似问题