X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3203ed1f4fb6f4617e94d5351661ba07e8b8f833..6aeed0145f123c033e0fdfc5b45066894fffc2a2:/src/mc/Process.cpp diff --git a/src/mc/Process.cpp b/src/mc/Process.cpp index 3ad754e1b9..3ffcd23653 100644 --- a/src/mc/Process.cpp +++ b/src/mc/Process.cpp @@ -27,12 +27,11 @@ #include -#include "mc_object_info.h" -#include "mc_unw.h" -#include "mc_snapshot.h" -#include "mc_ignore.h" -#include "mc_smx.h" -#include "mc_server.h" +#include "src/mc/mc_object_info.h" +#include "src/mc/mc_unw.h" +#include "src/mc/mc_snapshot.h" +#include "src/mc/mc_ignore.h" +#include "src/mc/mc_smx.h" #include "src/mc/Process.hpp" #include "src/mc/AddressSpace.hpp" @@ -67,6 +66,7 @@ static const char *const FILTERED_LIBS[] = { "libelf", "libgcc_s", "liblua5.1", + "liblua5.3", "liblzma", "libm", "libpthread", @@ -100,7 +100,7 @@ struct s_mc_memory_map_re { static char* MC_get_lib_name(const char* pathname, struct s_mc_memory_map_re* res) { - const char* map_basename = basename((char*) pathname); + const char* map_basename = xbt_basename((char*) pathname); regmatch_t match; if(regexec(&res->so_re, map_basename, 1, &match, 0)) @@ -212,14 +212,12 @@ Process::Process(pid_t pid, int sockfd) : AddressSpace(this) process->socket_ = sockfd; process->pid_ = pid; process->running_ = true; - process->status_ = 0; - process->memory_map_ = get_memory_map(pid); + process->memory_map_ = simgrid::xbt::get_memory_map(pid); process->cache_flags = MC_PROCESS_CACHE_FLAG_NONE; - process->heap = NULL; - process->heap_info = NULL; process->init_memory_map_info(); process->clear_refs_fd_ = -1; process->pagemap_fd_ = -1; + process->privatized_ = false; int fd = open_vm(process->pid_, O_RDWR); if (fd<0) @@ -274,12 +272,6 @@ Process::~Process() process->cache_flags = MC_PROCESS_CACHE_FLAG_NONE; - free(process->heap); - process->heap = NULL; - - free(process->heap_info); - process->heap_info = NULL; - if (process->clear_refs_fd_ >= 0) close(process->clear_refs_fd_); if (process->pagemap_fd_ >= 0) @@ -295,11 +287,10 @@ void Process::refresh_heap() { xbt_assert(mc_mode == MC_MODE_SERVER); // Read/dereference/refresh the std_heap pointer: - if (!this->heap) { - this->heap = (struct mdesc*) malloc(sizeof(struct mdesc)); - } - this->read_bytes(this->heap, sizeof(struct mdesc), remote(this->heap_address), - simgrid::mc::ProcessIndexDisabled); + if (!this->heap) + this->heap = std::unique_ptr(new s_xbt_mheap_t()); + this->read_bytes(this->heap.get(), sizeof(struct mdesc), + remote(this->heap_address), simgrid::mc::ProcessIndexDisabled); this->cache_flags |= MC_PROCESS_CACHE_FLAG_HEAP; } @@ -314,10 +305,10 @@ void Process::refresh_malloc_info() if (!(this->cache_flags & MC_PROCESS_CACHE_FLAG_HEAP)) this->refresh_heap(); // Refresh process->heapinfo: - size_t malloc_info_bytesize = - (this->heap->heaplimit + 1) * sizeof(malloc_info); - this->heap_info = (malloc_info*) realloc(this->heap_info, malloc_info_bytesize); - this->read_bytes(this->heap_info, malloc_info_bytesize, + size_t count = this->heap->heaplimit + 1; + if (this->heap_info.size() < count) + this->heap_info.resize(count); + this->read_bytes(this->heap_info.data(), count * sizeof(malloc_info), remote(this->heap->heapinfo), simgrid::mc::ProcessIndexDisabled); this->cache_flags |= MC_PROCESS_CACHE_FLAG_MALLOC_INFO; } @@ -337,14 +328,14 @@ void Process::init_memory_map_info() if(regcomp(&res.so_re, SO_RE, 0) || regcomp(&res.version_re, VERSION_RE, 0)) xbt_die(".so regexp did not compile"); - std::vector const& maps = this->memory_map_; + std::vector const& maps = this->memory_map_; const char* current_name = NULL; this->object_infos.resize(0); for (size_t i=0; i < maps.size(); i++) { - simgrid::mc::VmMap const& reg = maps[i]; + simgrid::xbt::VmMap const& reg = maps[i]; const char* pathname = maps[i].pathname.c_str(); // Nothing to do @@ -515,14 +506,14 @@ char* Process::read_string(remote_ptr address) const const void *Process::read_bytes(void* buffer, std::size_t size, remote_ptr address, int process_index, - AddressSpace::ReadMode mode) const + ReadOptions options) const { if (process_index != simgrid::mc::ProcessIndexDisabled) { std::shared_ptr const& info = this->find_object_info_rw((void*)address.address()); // Segment overlap is not handled. #ifdef HAVE_SMPI - if (info.get() && info.get()->privatized()) { + if (info.get() && this->privatized(*info)) { if (process_index < 0) xbt_die("Missing process index"); if (process_index >= (int) MC_smpi_process_count()) @@ -645,5 +636,76 @@ void Process::read_pagemap(uint64_t* pagemap, size_t page_start, size_t page_cou xbt_die("Could not read pagemap"); } +void Process::ignore_heap(IgnoredHeapRegion const& region) +{ + if (ignored_heap_.empty()) { + ignored_heap_.push_back(std::move(region)); + return; + } + + typedef std::vector::size_type size_type; + + size_type start = 0; + size_type end = ignored_heap_.size() - 1; + + // Binary search the position of insertion: + size_type cursor; + while (start <= end) { + cursor = start + (end - start) / 2; + auto& current_region = ignored_heap_[cursor]; + if (current_region.address == region.address) + return; + else if (current_region.address < region.address) + start = cursor + 1; + else if (cursor != 0) + end = cursor - 1; + // Avoid underflow: + else + break; + } + + // Insert it mc_heap_ignore_region_t: + if (ignored_heap_[cursor].address < region.address) + ++cursor; + ignored_heap_.insert( ignored_heap_.begin() + cursor, region); +} + +void Process::unignore_heap(void *address, size_t size) +{ + typedef std::vector::size_type size_type; + + size_type start = 0; + size_type end = ignored_heap_.size() - 1; + + // Binary search: + size_type cursor; + while (start <= end) { + cursor = (start + end) / 2; + auto& region = ignored_heap_[cursor]; + if (region.address == address) { + ignored_heap_.erase(ignored_heap_.begin() + cursor); + return; + } else if (region.address < address) + start = cursor + 1; + else if ((char *) region.address <= ((char *) address + size)) { + ignored_heap_.erase(ignored_heap_.begin() + cursor); + return; + } else if (cursor != 0) + end = cursor - 1; + // Avoid underflow: + else + break; + } +} + +void Process::ignore_local_variable(const char *var_name, const char *frame_name) +{ + if (frame_name != nullptr && strcmp(frame_name, "*") == 0) + frame_name = nullptr; + for (std::shared_ptr const& info : + this->object_infos) + info->remove_local_variable(var_name, frame_name); +} + } }