繁体   English   中英

如何在 linux/ubuntu 中找到进程使用的确切堆栈和堆内存?

[英]How to find exact stack and heap memory used by a process in linux/ubuntu?

我有用 C 语言编写的项目。 我需要找出这个进程使用了多少堆栈(局部变量,..)和堆内存(使用 malloc 分配)。 这样我就可以决定某个特定的微控制器(目前我的控制器有 30KB RAM)是否满足我项目的最低 RAM/堆栈/堆要求。

我试过/proc/pid/smaps。 但即使文件仅包含 2 个局部整数变量,它也会显示最小 4kB 堆栈。(我认为它显示的是页面大小或内存范围)。

top 命令输出对此要求没有用。

是否有任何工具可以实时以变量等形式找出进程使用的堆栈(以字节为单位精度适中)(或者至少在生命周期内达到的最大值也可以)。(稍后我需要设置 CI 作业找到这些。)

至少我可以使用如下所示的 malloc 包装器 API 找出堆。(不知道如何以简单的方式找出已释放的内存。)

例如:void call_malloc(size_t n) { usedMem = usedMem + n; // 全局变量 p= malloc(n); }

我找到了合理的解决方案。

编译时使用-fstack-usage flag. Eg: gcc -g -fstack-usage filename.c -fstack-usage flag. Eg: gcc -g -fstack-usage filename.c

在 makefile 的 CFLAGS 中使用相同的内容。 无需运行可执行文件。 编译后,该文件夹中将出现相同名称的扩展名为.su 的文件。 可以使用cat/vim/notepad等打开。

对于堆内存计算,只需使用valgrind。

PS:在挖掘更多内容时,我发现了以下答案。 如何使用 gcc 确定嵌入式系统中的最大堆栈使用量?

如果您使用非常基本的命令运行代码

/usr/bin/time --verbose ${executable}

您将获得以下类型的输出。 如果您专注于“最大驻留集大小”,并考虑“平均堆栈大小”和“平均总大小”(即堆栈 + 堆)的值,这会满足您的需求吗?

Command being timed: "{your_executable}"
User time (seconds): 0.00
System time (seconds): 0.01
Percent of CPU this job got: 90%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.01
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 4032
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 385
Voluntary context switches: 5
Involuntary context switches: 84
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

这也在此处进行了更广泛的讨论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM