c++ - 找出哪个对象/数组使用最多的堆栈内存

标签 c++ memory stack-overflow

我怎样才能找出哪个数组/对象/等是堆栈内存最贪婪的用户?


注意:以下是问题的原始上下文。从那时起,我意识到我对堆栈的工作原理存在严重的误解。

我有一个以段错误结束的错误程序。段错误是由一个变量突然被无意义的值覆盖引起的……该变量在堆栈内存中。

因此我的理解是我在程序的其他一些点发生了堆栈内存溢出,这破坏了下一个堆栈内存缓冲区开头的变量值。

但是,valgrind 在遇到段错误之前不会显示任何错误/警告(当使用 --leak-checks=yes 启动时)。

因此,一个解决方案是找到哪些对象/数组/等使用了大部分堆栈内存并将它们移动到堆内存。

最佳答案

如果您在 Mac 上开发,那么您可以使用 Instruments ,它有一个内存分析器,可以告诉您内存是在哪里分配的,并根据它进行聚合。

否则,您可以使用 valgrind 的 Massif工具

如果您使用的是 Mac,则可以使用 Instruments。否则你可以尝试使用 Massif . Massif manual 的示例输出:

--------------------------------------------------------------------------------
  n        time(B)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
 10         10,080           10,080           10,000            80            0
 11         12,088           12,088           12,000            88            0
 12         16,096           16,096           16,000            96            0
 13         20,104           20,104           20,000           104            0
 14         20,104           20,104           20,000           104            0
99.48% (20,000B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->49.74% (10,000B) 0x804841A: main (example.c:20)
| 
->39.79% (8,000B) 0x80483C2: g (example.c:5)
| ->19.90% (4,000B) 0x80483E2: f (example.c:11)
| | ->19.90% (4,000B) 0x8048431: main (example.c:23)
| |   
| ->19.90% (4,000B) 0x8048436: main (example.c:25)
|   
->09.95% (2,000B) 0x80483DA: f (example.c:10)
  ->09.95% (2,000B) 0x8048431: main (example.c:23)

关于c++ - 找出哪个对象/数组使用最多的堆栈内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36106026/

相关文章:

c++ - 如何从链表中的字符串中获取第一个字母?

python - 串口输入到Python3

c - 循环缓冲区的结束指针问题

javascript - setTimeout 如何防止潜在的 stackoverflow

c++ - WEXITSTATUS 始终返回 0

linux - 使用/dev/zero 访问大内存 (32 GB)

PHP 垃圾收集和内存优化

c++ - 为什么在某些机器上堆栈溢出,但在另一台机器上出现段错误?

android - 自定义模式类中的 Parcelable 抛出 StackOverflow 错误

c++ - 如何从数组中获取平均值