如何通过CC++代码以编程方式获取当前可用的内存量?

如何通过CC++代码以编程方式获取当前可用的内存量?,第1张

概述在我的中间件软件层,我收到了很多崩溃的消息, 页面分配失败.顺序:10,模式:0xd1 据了解,由于多个原因可能会导致崩溃,耗尽动态内存以进一步分配或内存碎片. 跟踪消息的回溯与第三方驱动程序模块无关,最可能的问题是该驱动程序,但遗憾的是,我无法从中获取任何调试信息和源代码.我想使用一些编程功能调用来描述我的源代码,以排除上述两种情况的可能性. 我不能使用valgrind,因为ARM尚未完全支持V 在我的中间件软件层,我收到了很多崩溃的消息,

页面分配失败.顺序:10,模式:0xd1

据了解,由于多个原因可能会导致崩溃,耗尽动态内存以进一步分配或内存碎片.

跟踪消息的回溯与第三方驱动程序模块无关,最可能的问题是该驱动程序,但遗憾的是,我无法从中获取任何调试信息和源代码.我想使用一些编程功能调用来描述我的源代码,以排除上述两种情况的可能性.

我不能使用valgrind,因为ARM尚未完全支持Valgrind.

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

Application: page allocation failure. order:10,mode:0xd1Backtrace:                                                  [<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:008a47ccMem-info:DMA per-cpu:cpu    0: hi:   18,btch:   3 usd:   0active_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:0DMA free:16548kB min:1104kB low:1380kB high:1656kB active_anon:16480kB inactive_anon:536kB active_file:316kB inactive_file:14916kB unevictable:0kB isolated(olowmem_reserve[]: 0 0 0DMA: 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 = 16548kB3872 total pagecache pages19200 pages of RAM4209 free pages4738 reserved pages960 slab pages1751 pages shared0 pages swap cached

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

解决方法 您显示的消息表示无法为内核分配分配内存,而不是用户空间分配.这是一个4MB的请求(这是什么顺序= 10意味着)块的连续物理内存.这是一个非常大的kmalloc()请求,并不奇怪,它失败(可能是由于内存碎片而不是免费内存).

您可以找到/ proc / meminfo中有多少可用内存可用,但是在回溯跟踪之后,即可从内核日志中获得更详细的摘要 – 从“Mem-info”行开始.

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

从阅读source to the tsif driver看来,您似乎正在使用,似乎驱动程序请求一个完全由用户空间控制的大小的内核分配,由TSIF_REQ_RX_BUF ioctl()调用(这是一个非常糟糕的设计,特别是考虑到它甚至不尝试向用户空间报告失败!).我的建议是减少您使用此ioctl请求的缓冲区的大小.

总结

以上是内存溢出为你收集整理的如何通过C/C++代码以编程方式获取当前可用的内存量?全部内容,希望文章能够帮你解决如何通过C/C++代码以编程方式获取当前可用的内存量?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1248411.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存