微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我怎样才能以编程方式从C / C ++代码获取当前可用的内存量?

在我的中间件软件层,我收到了很多与消息有关的崩溃,

page allocation failure. order:10,mode:0xd1

据我所知,可能会由于多种原因发生崩溃,用于进一步分配或内存碎片的dynamic内存不足。

跟踪消息的回溯与第三方驱动程序模块无关,因此很可能是该驱动程序出现问题,但不幸的是,我无法从该源代码或源代码获取任何debugging信息。 我想使用一些编程函数调用来剖析我的源代码,以排除上面提到的两种情况的可能性。

创build无边界的DirectShow窗口

挂钩 – hotpatching

什么是内存映射文件和实际的内存使用情况?

如何通过Xlib在启animation面中绘制一个string

检查是否加载了特定的设备驱动程序

我不能使用valgrind因为ARM还没有完全支持Valgrind。

[更新:]添加堆栈跟踪,作为@ caf的答案表明可以有一些有价值的信息。

Application: page allocation failure. order:10,mode:0xd1 Backtrace: [<c00297d0>] (dump_backtrace+0x0/0x114) from [<c02812b8>] (dump_stack+0x18/0x1c) r7:0000000a r6:000000d1 r5:00000000 r4:00000000 [<c02812a0>] (dump_stack+0x0/0x1c) from [<c00716e4>] (__alloc_pages_nodemask+0x49c/0x4fc) [<c0071248>] (__alloc_pages_nodemask+0x0/0x4fc) from [<c007175c>] (__get_free_pages+0x18/0x44) [<c0071744>] (__get_free_pages+0x0/0x44) from [<bf021790>] (tsif_request_rx_buffer+0x74/0xf4 [tsif_data]) [<bf02171c>] (tsif_request_rx_buffer+0x0/0xf4 [tsif_data]) from [<bf021bd8>] (tsif_data_ioctl+0x17c/0x9d4 [tsif_data]) r7:be9e8604 r6:c0045319 r5:c3793400 r4:00000007 [<bf021a5c>] (tsif_data_ioctl+0x0/0x9d4 [tsif_data]) from [<c00a1c30>] (vfs_ioctl+0x78/0x94) [<c00a1bb8>] (vfs_ioctl+0x0/0x94) from [<c00a22e0>] (do_vfs_ioctl+0x594/0x5f0) r7:c2067e80 r6:00000021 r5:c2067e80 r4:00000021 [<c00a1d4c>] (do_vfs_ioctl+0x0/0x5f0) from [<c00a237c>] (sys_ioctl+0x40/0x64) [<c00a233c>] (sys_ioctl+0x0/0x64) from [<c0025ec0>] (ret_fast_syscall+0x0/0x28) r7:00000036 r6:00144220 r5:00139030 r4:008a47cc Mem-info: DMA per-cpu: cpu 0: hi: 18,btch: 3 usd: 0 active_anon:4120 inactive_anon:134 isolated_anon:0 active_file:79 inactive_file:3729 isolated_file:0 unevictable:0 dirty:0 writeback:0 unstable:0 buffer:0 free:4137 slab_reclaimable:198 slab_unreclaimable:894 mapped:1707 shmem:64 pagetables:75 bounce:0 DMA free:16548kB min:1104kB low:1380kB high:1656kB active_anon:16480kB inactive_anon:536kB active_file:316kB inactive_file:14916kB unevictable:0kB isolated(o lowmem_reserve[]: 0 0 0 DMA: 215*4kB 131*8kB 73*16kB 49*32kB 30*64kB 8*128kB 3*256kB 2*512kB 3*1024kB 2*2048kB 0*4096kB 0*8192kB 0*16384kB = 16548kB 3872 total pagecache pages 19200 pages of RAM 4209 free pages 4738 reserved pages 960 slab pages 1751 pages shared 0 pages swap cached

所以问题是如何以编程方式从C / C ++代码获取当前可用的内存量,该平台是Linux。

在Ubuntu下C ++或Mono的最佳编程IDE是什么?

如何获得在Windows中的Z顺序?

Windows窗体:ShowDialog – 对话框不显示

分布式软件使用gdb进行debugging

asynchronous调用C ++中的CreateFile和ReadFile

显示的消息表示未能为内核分配分配内存,而不是为用户空间分配分配内存。 这是一个连续的物理内存块4MB(这是什么order = 10手段)的请求。 这是一个非常大的kmalloc()请求,并不奇怪它失败(可能是由于内存碎片而不是空闲内存)。

您可以在/proc/meminfo找到有多少空闲内存可用,但是在回溯后立即从内核日志中获得更详细的总结 – 从行"Mem-info" 。

你的回溯显示有16548kB的可用内存,但最大的块是2048kB( order = 9 )。 所以内存碎片确实是你的问题。

从阅读源代码到您似乎使用的tsif驱动程序 ,似乎驱动程序请求的内核分配完全由用户空间控制,由TSIF_REQ_RX_BUF ioctl()调用(这是一个非常糟糕的设计,尤其是考虑到它甚至不尝试向用户空间报告故障!)。 我的建议是减少你使用这个ioctl请求的缓冲区的大小。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐