diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index 437aeff5d..cb8af00c6 100644 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -440,7 +440,8 @@ if [ $SRS_GPERF = YES ]; then rm -rf ${SRS_OBJS}/gperftools-2.1 && cd ${SRS_OBJS} && unzip -q ../3rdparty/gperftools-2.1.zip && cd gperftools-2.1 && ./configure --prefix=`pwd`/_release --enable-frame-pointers && make ${SRS_JOBS} && make install && - cd .. && rm -f gperf && ln -sf gperftools-2.1/_release gperf + cd .. && rm -f gperf && ln -sf gperftools-2.1/_release gperf && + rm -f pprof && ln -sf gperf/bin/pprof pprof ) fi # check status diff --git a/trunk/research/gperftools/heap-checker/Makefile b/trunk/research/gperftools/heap-checker/Makefile new file mode 100644 index 000000000..4f3c86694 --- /dev/null +++ b/trunk/research/gperftools/heap-checker/Makefile @@ -0,0 +1,6 @@ +heap_checker: heap_checker.cc Makefile + g++ -o heap_checker heap_checker.cc -g -O0 -ansi \ + -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free \ + ../../../objs/gperf/lib/libtcmalloc_and_profiler.a -lpthread +clean: + rm -f heap_checker \ No newline at end of file diff --git a/trunk/research/gperftools/heap-checker/heap_checker.cc b/trunk/research/gperftools/heap-checker/heap_checker.cc new file mode 100644 index 000000000..c7dd33162 --- /dev/null +++ b/trunk/research/gperftools/heap-checker/heap_checker.cc @@ -0,0 +1,73 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013-2014 winlin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +/** +set the pprof path if not set: + export PPROF_PATH=`pwd`/../../../objs/pprof +to check mem leak: + make && env HEAPCHECK=normal ./heap_checker +*/ +#include +#include +#include +#include + +void explicit_leak_imp() { + printf("func leak: do something...\n"); + for (int i = 0; i < 1024; ++i) { + char* p = new char[1024]; + } + printf("func leak: memory leaked\n"); +} +void explicit_leak() { + explicit_leak_imp(); +} + +char* pglobal = NULL; +void global_leak_imp() { + printf("global leak: do something...\n"); + for (int i = 0; i < 1024; ++i) { + pglobal = new char[189]; + } + printf("global leak: memory leaked\n"); +} +void global_leak() { + global_leak_imp(); +} + +void handler(int sig) { + exit(0); +} +int main(int argc, char** argv) { + signal(SIGINT, handler); + + global_leak(); + printf("press CTRL+C if you want to abort the program.\n"); + sleep(3); + + explicit_leak(); + printf("press CTRL+C if you want to abort the program.\n"); + sleep(3); + + return 0; +} + diff --git a/trunk/research/gperftools/heap-profiler/Makefile b/trunk/research/gperftools/heap-profiler/Makefile new file mode 100644 index 000000000..39cc156c9 --- /dev/null +++ b/trunk/research/gperftools/heap-profiler/Makefile @@ -0,0 +1,6 @@ +heap_profiler: heap_profiler.cc Makefile + g++ -o heap_profiler heap_profiler.cc -g -O0 -ansi \ + -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free \ + -I../../../objs/gperf/include ../../../objs/gperf/lib/libtcmalloc_and_profiler.a -lpthread +clean: + rm -f heap_profiler srs.*.heap diff --git a/trunk/research/gperftools/heap-profiler/heap_profiler.cc b/trunk/research/gperftools/heap-profiler/heap_profiler.cc new file mode 100644 index 000000000..fb38ef632 --- /dev/null +++ b/trunk/research/gperftools/heap-profiler/heap_profiler.cc @@ -0,0 +1,67 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013-2014 winlin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +/** +set the pprof path if not set: + export PPROF_PATH=`pwd`/../../../objs/pprof +to do mem profile: + make && rm -f srs.*.heap && env ./heap_profiler + $PPROF_PATH --text heap_profiler ./*.heap +*/ +#include +#include +#include +#include + +#include + +void memory_alloc_profile_imp() { + for (int i = 0; i < 2; ++i) { + char* p = new char[110 * 1024 * 1024]; + for (int j = 0; j < 110 * 1024 * 1024; ++j) { + p[j] = j; + } + printf("mem profile, increase 110MB\n"); + printf("press CTRL+C if you want to abort the program.\n"); + sleep(5); + } +} +void memory_alloc_profile() { + memory_alloc_profile_imp(); +} + +void handler(int sig) { + exit(0); +} +int main(int argc, char** argv) { + signal(SIGINT, handler); + + // must start profiler manually. + HeapProfilerStart("srs"); + + memory_alloc_profile(); + // not neccessary to call stop. + //HeapProfilerStop(); + + return 0; +} +