Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt应用程序因内存不足(OOM)而被终止_C++_Linux_Qt_Memory Leaks_Embedded Linux - Fatal编程技术网

C++ Qt应用程序因内存不足(OOM)而被终止

C++ Qt应用程序因内存不足(OOM)而被终止,c++,linux,qt,memory-leaks,embedded-linux,C++,Linux,Qt,Memory Leaks,Embedded Linux,我正在嵌入式Linux平台上运行一个Qt应用程序。该系统有128 MB RAM,512MB NAND,无交换。应用程序为外围设备使用一个自定义库,其余的都是Qt和c/c++libs。该应用程序也使用SQLITE3 2-3小时后,机器开始运行非常缓慢,shell命令需要10秒左右的时间才能响应。最终机器挂起,最后OOM killer终止应用程序,系统开始以正常速度运行 使用top命令进行一些系统内存观察后发现,当应用程序运行时,系统空闲的内存在减少,而slab不断增加。以下是顶部的快照。应用程序名

我正在嵌入式Linux平台上运行一个Qt应用程序。该系统有128 MB RAM,512MB NAND,无交换。应用程序为外围设备使用一个自定义库,其余的都是Qt和c/c++libs。该应用程序也使用SQLITE3

2-3小时后,机器开始运行非常缓慢,shell命令需要10秒左右的时间才能响应。最终机器挂起,最后OOM killer终止应用程序,系统开始以正常速度运行

使用top命令进行一些系统内存观察后发现,当应用程序运行时,系统空闲的内存在减少,而slab不断增加。以下是顶部的快照。应用程序名为xyz

在应用程序启动时:

Mem total:126164 anon:3308 map:8436 free:32456
 slab:60936 buf:0 cache:27528 dirty:0 write:0
Swap total:0 free:0
  PID   VSZ VSZRW^  RSS (SHR) DIRTY (SHR) STACK COMMAND
  776 29080  9228  8036   528   968     0    84 ./xyz -qws
  781  3960   736  1976  1456   520     0    84 sshd: root@notty
  786  3676   680  1208   764   416     0    88 /usr/libexec/sftp-server
  770  3792   568  1948  1472   464     0    84 {sshd} sshd: root@pts/0
  766  3792   568   956   688   252     0    84 /usr/sbin/sshd
  388  1864   284   552   332   188     0    84 udevd --daemon
  789  2832   272   688   584    84     0    84 top
  774  2828   268   668   560    84     0    84 -sh
  709  2896   268   556   464    80     0    84 /usr/sbin/inetd
  747  2828   268   596   516    68     0    84 /sbin/getty -L ttymxc0 115200 vt100
  777  2824   264   444   368    68     0    84 tee out.log
  785  2824   264   484   416    68     0    84 sh -c /usr/libexec/sftp-server
    1  2824   264   556   488    64     0    84 init
一段时间后:

    Mem total:126164 anon:3312 map:8440 free:9244
 slab:83976 buf:0 cache:27584 dirty:0 write:0
Swap total:0 free:0
  PID   VSZ VSZRW^  RSS (SHR) DIRTY (SHR) STACK COMMAND
  776 29080  9228  8044   528   972     0    84 ./xyz -qws
  781  3960   736  1976  1456   520     0    84 sshd: root@notty
  786  3676   680  1208   764   416     0    88 /usr/libexec/sftp-server
  770  3792   568  1948  1472   464     0    84 {sshd} sshd: root@pts/0
  766  3792   568   956   688   252     0    84 /usr/sbin/sshd
  388  1864   284   552   332   188     0    84 udevd --daemon
  789  2832   272   688   584    84     0    84 top
  774  2828   268   668   560    84     0    84 -sh
  709  2896   268   556   464    80     0    84 /usr/sbin/inetd
  747  2828   268   596   516    68     0    84 /sbin/getty -L ttymxc0 115200 vt100
  777  2824   264   444   368    68     0    84 tee out.log
  785  2824   264   484   416    68     0    84 sh -c /usr/libexec/sftp-server
    1  2824   264   556   488    64     0    84 init
有趣的是,我看不到与应用程序本身有关的top的输出有任何重大变化。最后,应用程序被终止,top之后输出:

    Mem total:126164 anon:2356 map:916 free:2368
 slab:117944 buf:0 cache:1580 dirty:0 write:0
Swap total:0 free:0
  PID   VSZ VSZRW^  RSS (SHR) DIRTY (SHR) STACK COMMAND
  781  3960   736   708   184   520     0    84 sshd: root@notty
  786  3724   728   736   172   484     0    88 /usr/libexec/sftp-server
  770  3792   568   648   188   460     0    84 {sshd} sshd: root@pts/0
  766  3792   568   252     0   252     0    84 /usr/sbin/sshd
  388  1864   284   188     0   188     0    84 udevd --daemon
  819  2832   272   676   348    84     0    84 top
  774  2828   268   512   324    96     0    84 -sh
  709  2896   268    80     0    80     0    84 /usr/sbin/inetd
  747  2828   268    68     0    68     0    84 /sbin/getty -L ttymxc0 115200 vt100
  785  2824   264    68     0    68     0    84 sh -c /usr/libexec/sftp-server
    1  2824   264    64     0    64     0    84 init
dmesg显示:

sh invoked oom-killer: gfp_mask=0xd0, order=2, oomkilladj=0
[<c002d4c4>] (unwind_backtrace+0x0/0xd4) from [<c0073ac0>]              (oom_kill_process+0x54/0x1b8)
[<c0073ac0>] (oom_kill_process+0x54/0x1b8) from [<c0073f14>] (__out_of_memory+0x154/0x178)
[<c0073f14>] (__out_of_memory+0x154/0x178) from [<c0073fa0>] (out_of_memory+0x68/0x9c)
[<c0073fa0>] (out_of_memory+0x68/0x9c) from [<c007649c>] (__alloc_pages_nodemask+0x3e0/0x4c8)
[<c007649c>] (__alloc_pages_nodemask+0x3e0/0x4c8) from [<c0076598>] (__get_free_pages+0x14/0x4c)
[<c0076598>] (__get_free_pages+0x14/0x4c) from [<c002f528>] (get_pgd_slow+0x14/0xdc)
[<c002f528>] (get_pgd_slow+0x14/0xdc) from [<c0043890>] (mm_init+0x84/0xc4)
[<c0043890>] (mm_init+0x84/0xc4) from [<c0097b94>] (bprm_mm_init+0x10/0x138)
[<c0097b94>] (bprm_mm_init+0x10/0x138) from [<c00980a8>] (do_execve+0xf4/0x2a8)
[<c00980a8>] (do_execve+0xf4/0x2a8) from [<c002afc4>] (sys_execve+0x38/0x5c)
[<c002afc4>] (sys_execve+0x38/0x5c) from [<c0027d20>] (ret_fast_syscall+0x0/0x2c)
Mem-info:
DMA per-cpu:
CPU    0: hi:    0, btch:   1 usd:   0
Normal per-cpu:
CPU    0: hi:   42, btch:   7 usd:   0
Active_anon:424 active_file:11 inactive_anon:428
 inactive_file:3 unevictable:0 dirty:0 writeback:0 unstable:0
 free:608 slab:29498 mapped:14 pagetables:59 bounce:0
DMA free:692kB min:268kB low:332kB high:400kB active_anon:0kB inactive_anon:0kB active_file:4kB inactive_file:0kB unevictable:0kB present:24384kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 103 103
Normal free:1740kB min:1168kB low:1460kB high:1752kB active_anon:1696kB inactive_anon:1712kB active_file:40kB inactive_file:12kB unevictable:0kB present:105664kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0
DMA: 3*4kB 3*8kB 5*16kB 2*32kB 4*64kB 2*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 692kB
Normal: 377*4kB 1*8kB 4*16kB 1*32kB 2*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 1740kB
30 total pagecache pages
0 pages in swap cache
Swap cache stats: add 0, delete 0, find 0/0
Free swap  = 0kB
Total swap = 0kB
32768 pages of RAM
687 free pages
1306 reserved pages
29498 slab pages
59 pages shared
0 pages swap cached
Out of memory: kill process 774 (sh) score 339 or a child
Killed process 776 (xyz)

非常感谢任何指针…

如果您有一些数据结构分配,请检查添加子项等的正确性。。我的代码中也有类似的错误。此外,如果对数据库进行越来越大的查询,它可能会使用更多的ram内存。试着找一些内存泄漏检测器,看看是否有泄漏。

我不认为问题直接出在您的代码中。 原因很明显:您的应用程序空间没有增加(RSS和VSW都没有增加)

但是,您确实看到楼板的数量在增加。您不能从应用程序中使用或增加板的数量-这是一个仅限内核的东西

从我的头顶上看,板坯尺寸增加的一些明显原因:

  • 您从未真正关闭过网络套接字
  • 您读取了许多文件,但从未关闭它们
  • 你使用了很多IOCTL

我会运行strace并查看一下它的输出。strace拦截与内核的交互。如果您有内存问题,我希望重复调用brk()。如果您有其他问题,您将看到重复调用open而不是close。

您没有执行任何malloc,但是您正在使用可能正在执行malloc的几个库。所以,也许你没有正确地使用这些库,这就是导致你内存泄漏的原因。也许,但这就是我试图找出的原因。Valgrind报告了所有Qt库的泄漏…不知道为什么。但是我也在检查库。关于Qt和内存泄漏有很多问题,Valgrind经常报告由于Qt的隐式共享和插件系统导致的误报。是的,我已经读到了,但令人恼火的是Valgrind没有报告任何业务逻辑或其他LIB中的泄漏。现在我要在桌面上运行这个应用程序,看看它是否有相同的行为,所以至少我会知道这是一个平台/外围库问题。“它一定是我的应用程序,因为我的应用程序被杀死了”——不。不。不。这是一个常见的误解。OOM杀手本身就是一堆狗屎,它会杀死一个任意(读作:random,在最近的内核版本中使用了一些启发式)进程。您的进程被终止并不意味着它正在泄漏,也不意味着它对OOM条件有任何罪恶感(除了存在的以外)。这只是一个评论,而不是回答!事实上,正如我在上面提到的,我正在尝试Valgrind,它一直在报告Qt libs中的泄漏。谢谢你的回复。好吧,我可以安全地排除网络插座,因为我不使用它们(我非常确定,我甚至已经关闭了GPRS)。我使用的是文件,但总共有6个,包括数据库,我还负责关闭它们。但由于外围设备的原因,ioctl的活动肯定很频繁(strace证实了这一点)。不过没有太多的公开电话。顺便说一句,如果从应用程序调用mallocs,slab不受影响吗?@aditya:不,slab是一个内存池,仅在内核中使用。malloc()通过glibc转换为brk()调用-用于更大的区域。glibc创建的区域然后以应用程序需要的任何小块分发。
root@freescale ~/Application/app$ uname -a
Linux freescale 2.6.31-207-g7286c01 #2053 Fri Jun 22 10:29:11 IST 2012 armv5tejl GNU/Linux
Compiler : arm-none-linux-gnueabi-4.1.2 glibc2.5
cpp libs : libstdc++.so.6.0.8
Qt : 4.7.3 libs