Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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++ 如何以编程方式从C/C+;获取当前可用的内存量+;密码?_C++_C_Linux_Embedded Linux - Fatal编程技术网

C++ 如何以编程方式从C/C+;获取当前可用的内存量+;密码?

C++ 如何以编程方式从C/C+;获取当前可用的内存量+;密码?,c++,c,linux,embedded-linux,C++,C,Linux,Embedded Linux,在我的中间件软件层,由于消息,我收到了很多崩溃 页面分配失败。订单:10,模式:0xd1 据我所知,崩溃可能是由于多种原因造成的,动态内存不足,无法进一步分配或内存碎片 消息后面的回溯是不相关的,因为它是通过第三方驱动程序模块来的,最有可能的问题是该驱动程序,但不幸的是,我无法从该模块或源代码中获得任何调试信息。我想使用一些编程函数调用来分析我的源代码,以排除我上面提到的两种情况的可能性 我无法使用valgrind,因为valgrind尚未完全支持ARM [更新:]添加stacktrace,因为

在我的中间件软件层,由于消息,我收到了很多崩溃

页面分配失败。订单:10,模式:0xd1

据我所知,崩溃可能是由于多种原因造成的,动态内存不足,无法进一步分配或内存碎片

消息后面的回溯是不相关的,因为它是通过第三方驱动程序模块来的,最有可能的问题是该驱动程序,但不幸的是,我无法从该模块或源代码中获得任何调试信息。我想使用一些编程函数调用来分析我的源代码,以排除我上面提到的两种情况的可能性

我无法使用
valgrind
,因为valgrind尚未完全支持ARM

[更新:]添加stacktrace,因为@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
应用程序:页面分配失败。订单:10,模式:0xd1
回溯:
[](转储堆栈+0x18/0x1c)中的[](转储回溯+0x0/0x114)
r7:0000000 A r6:000000 D1 r5:00000000 r4:00000000
[](转储堆栈+0x0/0x1c)来自[](分配页面+节点掩码+0x49c/0x4fc)
[]来自[]的[(\uuuu-alloc\u-pages\u-nodemask+0x0/0x4fc)(\uuu-get\u-free\u-pages+0x18/0x44)
[](tsif请求\U接收\U缓冲区+0x74/0xf4[tsif数据])
[](tsif_请求_接收_缓冲区+0x0/0xf4[tsif_数据])来自[](tsif_数据_ioctl+0x17c/0x9d4[tsif_数据])
r7:be9e8604 r6:c0045319 r5:c3793400 r4:0000000 7
[](tsif_数据\u ioctl+0x0/0x9d4[tsif_数据])来自[](vfs_ioctl+0x78/0x94)
[](vfs_ioctl+0x0/0x94)来自[](do_vfs_ioctl+0x594/0x5f0)
r7:c2067e80 r6:00000021 r5:c2067e80 r4:00000021
[](从[](系统ioctl+0x40/0x64)执行[](执行vfs\u ioctl+0x0/0x5f0)
[](sys_ioctl+0x0/0x64)来自[](ret_fast_syscall+0x0/0x28)
r7:00000036 r6:00144220 r5:00139030 r4:008a47cc
成员信息:
每个cpu的DMA:
CPU 0:hi:18,btch:3美元:0
活动名称:4120非活动名称:134隔离名称:0
活动\u文件:79非活动\u文件:3729隔离\u文件:0
无法战胜:0脏:0写回:0不稳定:0缓冲区:0
免费:4137块可回收:198块不可回收:894块
映射:1707 shmem:64页表格:75反弹:0
DMA空闲:16548kB最小值:1104kB低:1380kB高:1656kB活动\u anon:16480kB非活动\u anon:536kB活动\u文件:316kB非活动\u文件:14916kB不可检测:0kB隔离(o
Lowmemu储量[]: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页缓存页总数
19200页RAM
4209免费页
4738保留页
960页
共有1751页
0页交换缓存

因此,问题是如何通过编程方式从C/C++代码中获取当前可用的内存量,平台是Linux。

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

您可以在
/proc/meminfo
中找到可用内存的数量,但是回溯后的内核日志中会立即提供更详细的摘要-从
行“Mem info”
开始


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


从您似乎正在使用的代码中可以看出,驱动程序请求的内核分配大小完全由用户空间控制,由
TSIF\u REQ\u RX\u BUF
ioctl()
调用(这是一个非常糟糕的设计,尤其是考虑到它甚至没有尝试向用户空间报告故障!)。我的建议是减少您使用此
ioctl

请求的缓冲区大小
man 2 getrlimit
?如果您想要安装的物理RAM数量,您可以解析
/proc/meminfo
@Victor Sorokin:
getrlimit
的第一行,获得当前可用的系统资源限制可分配金额。@Als然后您分析第二行的
/proc/meminfo
:)您是否考虑过将值-1转换为unsigned然后用作分配金额的可能性?我更新了相关的其他信息,您可以指出任何问题。谢谢!回答得很好!不幸的是,改变巨额拨款对我来说不是一个可行的选择,但你的回答给了我方向。发生的情况是,在应用程序的生命周期内,多次调用和释放ioctl
TSIF_REQ_RX_BUF
,这用于进一步分割内存。我的解决方法是在应用程序生命周期开始时只调用一次ioctl,我确信它会成功(因为当时碎片较少)&然后在整个应用程序生命周期中使用它,在生命周期结束时发布。