找出哪个 object/array 使用最多的堆栈内存
Finding out which object/array uses most stack memory
如何找出哪个 array/object/etc 是堆栈内存最贪吃的用户?
注意:以下是问题的原始上下文。从那时起,我意识到我对堆栈的工作原理有严重的误解。
我有一个以段错误结束的错误程序。段错误是由一个变量突然被无意义的值覆盖引起的……该变量在堆栈内存中。
因此我的理解是我在程序的其他一些点发生了堆栈内存溢出,它破坏了下一个堆栈内存缓冲区开头的变量值。
但是,valgrind 在遇到段错误之前不会显示任何 error/warning(当使用 --leak-checks=yes 启动时)。
因此,解决方案是找到哪个 objects/arrays/etc 使用了大部分堆栈内存并将它们移动到堆内存。
尝试使用观察点来查找何时写入内存
如果您在 Mac 上进行开发,那么您可以使用 Instruments,它有一个内存分析器,可以告诉您内存分配的位置并根据它进行聚合。
否则,您可以使用 valgrind 的 Massif 工具
如果您使用的是 Mac,则可以使用 Instruments。否则你可以尝试使用 Massif。 Massif 手册 的示例输出:
--------------------------------------------------------------------------------
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)
如何找出哪个 array/object/etc 是堆栈内存最贪吃的用户?
注意:以下是问题的原始上下文。从那时起,我意识到我对堆栈的工作原理有严重的误解。
我有一个以段错误结束的错误程序。段错误是由一个变量突然被无意义的值覆盖引起的……该变量在堆栈内存中。
因此我的理解是我在程序的其他一些点发生了堆栈内存溢出,它破坏了下一个堆栈内存缓冲区开头的变量值。
但是,valgrind 在遇到段错误之前不会显示任何 error/warning(当使用 --leak-checks=yes 启动时)。
因此,解决方案是找到哪个 objects/arrays/etc 使用了大部分堆栈内存并将它们移动到堆内存。
尝试使用观察点来查找何时写入内存
如果您在 Mac 上进行开发,那么您可以使用 Instruments,它有一个内存分析器,可以告诉您内存分配的位置并根据它进行聚合。
否则,您可以使用 valgrind 的 Massif 工具
如果您使用的是 Mac,则可以使用 Instruments。否则你可以尝试使用 Massif。 Massif 手册 的示例输出:
--------------------------------------------------------------------------------
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)