调解ns内存纠纷的一些思路手段
12-13
困扰了我很长的时间,从
http://www.isi.edu/nsnam/ns/ns-debugging.html
找到的调解内存纠纷的一些思路手段
Memory Debugging
The first thing to do if you run out of memory is to make sure you can use all the memory on your system. Some systems by default limit the memory available for individual programs to something less than all available memory. To relax this, use the limit or ulimit command These are shell functions---see the manual page for your shell for details. Limit is for csh, ulimit is for sh/bash.
Simulations of large networks can consume a lot of memory. Ns-2.0b17 supports Gray Watson's dmalloc library (see its web documentation and source code). To add it, install it on your system or leave its source in a directory parallel to ns-2 and specify --with-dmalloc when configuring ns. Then build all components of ns for which you want memory information with debugging symbols (this should include at least ns-2, possibly tclcl and otcl, maybe also tcl).
To use dmalloc:
define an alias (csh: alias dmalloc 'eval `\dmalloc -C \!*`', bash: function dmalloc { eval `command dmalloc -b $*` })
Turn debugging on by typing dmalloc -l logfile low
Run your program (which was configured and built with dmalloc as described above)
Interpret logfile by running dmalloc_summarize ns <logfile (You need to download dmalloc_summarize separately.)
On some platforms you may need to link things statically to get dmalloc to work. On Solaris this is done with by linking with these options: "-Xlinker -B -Xlinker -static {libraries} -Xlinker -B -Xlinker -dynamic -ldl -lX11 -lXext". (You'll need to change Makefile. Thanks to Haobo Yu and Doug Smith for workign this out.)
We can interpret a sample summary produced from this process on ns-2/tcl/ex/newmcast/cmcast-100.tcl with an exit statement after the 200'th duplex-link-of-interefaces statement:
Ns allocates ~6MB of memory.
~1MB is due to TclObject::bind
~900KB is StringCreate, all in 32-byte chunks
~700KB is NewVar, mostly in 24-byte chunks
Dmalloc_summarize must map function names to and from their addresses. It often can't resolve addresses for shared libraries, so if you see lots of memory allocated by things beginning with ``ra='', that's what it is. The best way to avoid this problem is to build ns statically (if not all, then as much as possible).
Dmalloc's memory allocation scheme is somewhat expensive, plus there's bookkeeping costs. Programs linked against dmalloc will consume more memory than against most standard mallocs.
Dmalloc can also diagnose other memory errors (duplicate frees, buffer overruns, etc.). See its documentation for details.
Memory Conservation Tips
Some tips to saving memory (some of these use examples from the cmcast-100.tcl script):
(Also see page on large simulations for more related info.)
If you have many links or nodes:
avoid trace-all
$ns trace-all $f causes trace objects to be pushed on all links. If you only want to trace one link, there's no need for this overhead. Saving is about 14 KB/link.
use arrays for sequences of variables
Each variable, say n$i in set n$i [$ns node], has a certain overhead. If a sequence of nodes are created as an array, i.e. n($i), then only one variable is created, consuming much less memory. Saving is about 40+ Byte/variable.
avoid unnecessary variables
If an object will not be referred to later on, avoid naming the object. E.g. set cmcast(1) [new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]] would be better if replaced by new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]. Saving is about 80 Byte/variable.
run on top of FreeBSD
malloc() overhead on FreeBSD is less than on some other systems. We will eventually port that allocator to other platofrms.
dynamic binding (NEW)
Using bind() in C++ consumes memory for each object you create. This approach can be very expensive if you create many identical objects. Changing bind()'s to delay_bind() changes this memory requirement to per-class. See ~ns/object.cc for an example of how to do binding, either way.
Some statistics collected by dmalloc (Investigating the bottleneck...)
KBytes cmcast-50.tcl(217 Links) cmcast-100.tcl(950 Links)
trace-all 8,084 28,541
turn off trace-all 5,095 15,465
use array 5,091 15,459
remove unnecessay variables 5,087 15,451
on SunOS 5,105 15,484
http://www.isi.edu/nsnam/ns/ns-debugging.html
找到的调解内存纠纷的一些思路手段
Memory Debugging
The first thing to do if you run out of memory is to make sure you can use all the memory on your system. Some systems by default limit the memory available for individual programs to something less than all available memory. To relax this, use the limit or ulimit command These are shell functions---see the manual page for your shell for details. Limit is for csh, ulimit is for sh/bash.
Simulations of large networks can consume a lot of memory. Ns-2.0b17 supports Gray Watson's dmalloc library (see its web documentation and source code). To add it, install it on your system or leave its source in a directory parallel to ns-2 and specify --with-dmalloc when configuring ns. Then build all components of ns for which you want memory information with debugging symbols (this should include at least ns-2, possibly tclcl and otcl, maybe also tcl).
To use dmalloc:
define an alias (csh: alias dmalloc 'eval `\dmalloc -C \!*`', bash: function dmalloc { eval `command dmalloc -b $*` })
Turn debugging on by typing dmalloc -l logfile low
Run your program (which was configured and built with dmalloc as described above)
Interpret logfile by running dmalloc_summarize ns <logfile (You need to download dmalloc_summarize separately.)
On some platforms you may need to link things statically to get dmalloc to work. On Solaris this is done with by linking with these options: "-Xlinker -B -Xlinker -static {libraries} -Xlinker -B -Xlinker -dynamic -ldl -lX11 -lXext". (You'll need to change Makefile. Thanks to Haobo Yu and Doug Smith for workign this out.)
We can interpret a sample summary produced from this process on ns-2/tcl/ex/newmcast/cmcast-100.tcl with an exit statement after the 200'th duplex-link-of-interefaces statement:
Ns allocates ~6MB of memory.
~1MB is due to TclObject::bind
~900KB is StringCreate, all in 32-byte chunks
~700KB is NewVar, mostly in 24-byte chunks
Dmalloc_summarize must map function names to and from their addresses. It often can't resolve addresses for shared libraries, so if you see lots of memory allocated by things beginning with ``ra='', that's what it is. The best way to avoid this problem is to build ns statically (if not all, then as much as possible).
Dmalloc's memory allocation scheme is somewhat expensive, plus there's bookkeeping costs. Programs linked against dmalloc will consume more memory than against most standard mallocs.
Dmalloc can also diagnose other memory errors (duplicate frees, buffer overruns, etc.). See its documentation for details.
Memory Conservation Tips
Some tips to saving memory (some of these use examples from the cmcast-100.tcl script):
(Also see page on large simulations for more related info.)
If you have many links or nodes:
avoid trace-all
$ns trace-all $f causes trace objects to be pushed on all links. If you only want to trace one link, there's no need for this overhead. Saving is about 14 KB/link.
use arrays for sequences of variables
Each variable, say n$i in set n$i [$ns node], has a certain overhead. If a sequence of nodes are created as an array, i.e. n($i), then only one variable is created, consuming much less memory. Saving is about 40+ Byte/variable.
avoid unnecessary variables
If an object will not be referred to later on, avoid naming the object. E.g. set cmcast(1) [new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]] would be better if replaced by new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]. Saving is about 80 Byte/variable.
run on top of FreeBSD
malloc() overhead on FreeBSD is less than on some other systems. We will eventually port that allocator to other platofrms.
dynamic binding (NEW)
Using bind() in C++ consumes memory for each object you create. This approach can be very expensive if you create many identical objects. Changing bind()'s to delay_bind() changes this memory requirement to per-class. See ~ns/object.cc for an example of how to do binding, either way.
Some statistics collected by dmalloc (Investigating the bottleneck...)
KBytes cmcast-50.tcl(217 Links) cmcast-100.tcl(950 Links)
trace-all 8,084 28,541
turn off trace-all 5,095 15,465
use array 5,091 15,459
remove unnecessay variables 5,087 15,451
on SunOS 5,105 15,484
感觉Segmentation fault错误一般都是指针操作错误,尤其是没有用new创建对象就进行
操作,以及操作Null的情况,真要用这个所说的,还有些麻烦啊。还是自己程序得设计
好,写好。
相关文章:
- 问一个OPnet软件内存使用的问题(05-08)
- 困惑:LTE L2协议栈开发中内存管理(05-08)
- 请问这道题用信息论怎样种思路来解呢?3X!(05-08)
- 帮我指点一下viterbi译码软判决的思路,谢谢!(05-08)
- 借问,我这样仿真的思路对不对,关于事件驱动模拟。(05-08)
- 谁能帮我解两个通信题目,给个思路也可(05-08)
射频专业培训教程推荐