From b0f66ea85dd23e62cf8c6763cb7c2712b8ff375e Mon Sep 17 00:00:00 2001 From: strange Date: Fri, 19 Feb 2010 09:38:23 -0700 Subject: [PATCH] Fixed several rather large memory leaks in the monitor. Approximately 100KB was being leaked with every run of the monitor . . . all due to me not freeing the overload_parser in ProgramManager ::place_initial_breakpoints(), and me not calling the destructor for the placement-new allocated Symbols in SymbolParser. --- monitor/src/Initializer.cpp | 2 +- monitor/src/ProgramManager.cpp | 2 ++ monitor/src/elf/SymbolParser.cpp | 3 +++ tests/.gitignore | 1 + tests/cpp_new_test | Bin 41732 -> 0 bytes 5 files changed, 7 insertions(+), 1 deletion(-) delete mode 100755 tests/cpp_new_test diff --git a/monitor/src/Initializer.cpp b/monitor/src/Initializer.cpp index db26366..f02f7f5 100644 --- a/monitor/src/Initializer.cpp +++ b/monitor/src/Initializer.cpp @@ -99,10 +99,10 @@ void Initializer::initialize() { void Initializer::deinitialize() { if(config_parser) delete config_parser; - if(storage_manager) delete storage_manager; if(argument_parser) delete argument_parser; if(program_manager) delete program_manager; if(server_socket) delete server_socket; + if(storage_manager) delete storage_manager; if(event_queue) delete event_queue; } diff --git a/monitor/src/ProgramManager.cpp b/monitor/src/ProgramManager.cpp index 53fc4b1..f3449f9 100644 --- a/monitor/src/ProgramManager.cpp +++ b/monitor/src/ProgramManager.cpp @@ -61,4 +61,6 @@ void ProgramManager::place_initial_breakpoints() { bp = new PTrace::Breakpoint(overload_offset + overload_parser->get_symbol("aesalon_free_hook")->get_address()+65, 0xcc); get_ptrace_portal()->add_breakpoint(bp); bp->add_observer(get_ptrace_portal()->get_free_observer()); + + delete overload_parser; } diff --git a/monitor/src/elf/SymbolParser.cpp b/monitor/src/elf/SymbolParser.cpp index c7a2c49..b9d4bf4 100644 --- a/monitor/src/elf/SymbolParser.cpp +++ b/monitor/src/elf/SymbolParser.cpp @@ -62,6 +62,9 @@ SymbolParser::SymbolParser(Parser *elf_parser) : elf_parser(elf_parser) { } SymbolParser::~SymbolParser() { + for(symbol_vector_t::iterator i = symbol_vector.begin(); i != symbol_vector.end(); i ++) { + Initializer::get_instance()->get_storage_manager()->get_symbol(*i)->~Symbol(); + } } Symbol *SymbolParser::get_symbol(std::string name) const { diff --git a/tests/.gitignore b/tests/.gitignore index b33cd87..826113b 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -5,3 +5,4 @@ interactive_malloc_test realloc_test fib_benchmark calloc_test +cpp_new_test diff --git a/tests/cpp_new_test b/tests/cpp_new_test deleted file mode 100755 index e61b486dded6dfa8bf9ee349c3c9d8d0afb408e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 41732 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 -- 2.11.4.GIT