X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e6ca184e99d50d0ee8fe405a83ee5277e2ecfce6..0a82e90d4cfdd7e27e1b946d22aff74a5abdda99:/src/mc/Process.cpp diff --git a/src/mc/Process.cpp b/src/mc/Process.cpp index 6434732f50..de44cf84f2 100644 --- a/src/mc/Process.cpp +++ b/src/mc/Process.cpp @@ -11,6 +11,10 @@ #include #include +#include + +#include + #include #include #include @@ -24,12 +28,10 @@ #include #include -#include #include #include #include -#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" @@ -42,13 +44,9 @@ using simgrid::mc::remote; -extern "C" { - XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_process, mc, "MC process information"); -} - // ***** Helper stuff namespace simgrid { @@ -108,13 +106,17 @@ struct s_mc_memory_map_re { static char* get_lib_name(const char* pathname, struct s_mc_memory_map_re* res) { - const char* map_basename = xbt_basename((char*) pathname); + char* map_basename = xbt_basename(pathname); regmatch_t match; - if(regexec(&res->so_re, map_basename, 1, &match, 0)) + if(regexec(&res->so_re, map_basename, 1, &match, 0)) { + free(map_basename); return nullptr; + } char* libname = strndup(map_basename, match.rm_so); + free(map_basename); + map_basename = nullptr; // Strip the version suffix: if(libname && !regexec(&res->version_re, libname, 1, &match, 0)) { @@ -202,7 +204,7 @@ int open_vm(pid_t pid, int flags) // ***** Process Process::Process(pid_t pid, int sockfd) : - AddressSpace(this),pid_(pid), socket_(sockfd), running_(true) + AddressSpace(this), pid_(pid), channel_(sockfd), running_(true) {} void Process::init() @@ -227,19 +229,14 @@ void Process::init() this->smx_process_infos.clear(); this->smx_old_process_infos.clear(); - this->unw_addr_space = unw_create_addr_space(&mc_unw_accessors , __BYTE_ORDER); - this->unw_underlying_addr_space = unw_create_addr_space(&mc_unw_vmread_accessors, __BYTE_ORDER); - this->unw_underlying_context = _UPT_create(this->pid_); + this->unw_addr_space = simgrid::mc::UnwindContext::createUnwindAddressSpace(); + this->unw_underlying_addr_space = simgrid::unw::create_addr_space(); + this->unw_underlying_context = simgrid::unw::create_context( + this->unw_underlying_addr_space, this->pid_); } Process::~Process() { - if (this->socket_ >= 0 && close(this->socket_) < 0) - xbt_die("Could not close communication socket"); - - this->maestro_stack_start_ = nullptr; - this->maestro_stack_end_ = nullptr; - if (this->memory_file >= 0) close(this->memory_file); @@ -247,13 +244,8 @@ Process::~Process() unw_destroy_addr_space(this->unw_underlying_addr_space); _UPT_destroy(this->unw_underlying_context); } - this->unw_underlying_context = nullptr; - this->unw_underlying_addr_space = nullptr; unw_destroy_addr_space(this->unw_addr_space); - this->unw_addr_space = nullptr; - - this->cache_flags = MC_PROCESS_CACHE_FLAG_NONE; if (this->clear_refs_fd_ >= 0) close(this->clear_refs_fd_); @@ -268,13 +260,12 @@ Process::~Process() */ void Process::refresh_heap() { - xbt_assert(mc_mode == MC_MODE_SERVER); // Read/dereference/refresh the std_heap pointer: 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; + this->cache_flags_ |= Process::cache_heap; } /** Refresh the information about the process @@ -284,16 +275,15 @@ void Process::refresh_heap() * */ void Process::refresh_malloc_info() { - xbt_assert(mc_mode == MC_MODE_SERVER); - if (!(this->cache_flags & MC_PROCESS_CACHE_FLAG_HEAP)) - this->refresh_heap(); // Refresh process->heapinfo: + if (this->cache_flags_ & Process::cache_malloc) + return; 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; + this->cache_flags_ |= Process::cache_malloc; } /** @brief Finds the range of the different memory segments and binary paths */ @@ -315,7 +305,7 @@ void Process::init_memory_map_info() const char* current_name = nullptr; - this->object_infos.resize(0); + this->object_infos.clear(); for (size_t i=0; i < maps.size(); i++) { simgrid::xbt::VmMap const& reg = maps[i]; @@ -357,7 +347,7 @@ void Process::init_memory_map_info() } std::shared_ptr info = - MC_find_object_info(this->memory_map_, pathname); + simgrid::mc::createObjectInformation(this->memory_map_, pathname); this->object_infos.push_back(info); if (is_executable) this->binary_info = info; @@ -371,7 +361,7 @@ void Process::init_memory_map_info() // Resolve time (including accross differents objects): for (auto const& object_info : this->object_infos) - MC_post_process_object_info(this, object_info.get()); + postProcessObjectInformation(this, object_info.get()); xbt_assert(this->maestro_stack_start_, "Did not find maestro_stack_start"); xbt_assert(this->maestro_stack_end_, "Did not find maestro_stack_end"); @@ -449,17 +439,16 @@ void Process::read_variable(const char* name, void* target, size_t size) const this->read_bytes(target, size, remote(var->address)); } -char* Process::read_string(RemotePtr address) const +std::string Process::read_string(RemotePtr address) const { if (!address) - return nullptr; + return {}; - off_t len = 128; - char* res = (char*) malloc(len); + std::vector res(128); off_t off = 0; while (1) { - ssize_t c = pread(this->memory_file, res + off, len - off, (off_t) address.address() + off); + ssize_t c = pread(this->memory_file, res.data() + off, res.size() - off, (off_t) address.address() + off); if (c == -1) { if (errno == EINTR) continue; @@ -469,15 +458,13 @@ char* Process::read_string(RemotePtr address) const if (c==0) xbt_die("Could not read string from remote process"); - void* p = memchr(res + off, '\0', c); + void* p = memchr(res.data() + off, '\0', c); if (p) - return res; + return std::string(res.data()); off += c; - if (off == len) { - len *= 2; - res = (char*) realloc(res, len); - } + if (off == (off_t) res.size()) + res.resize(res.size() * 2); } } @@ -489,7 +476,7 @@ const void *Process::read_bytes(void* buffer, std::size_t size, std::shared_ptr const& info = this->find_object_info_rw((void*)address.address()); // Segment overlap is not handled. -#ifdef HAVE_SMPI +#if HAVE_SMPI if (info.get() && this->privatized(*info)) { if (process_index < 0) xbt_die("Missing process index"); @@ -684,10 +671,45 @@ void Process::ignore_local_variable(const char *var_name, const char *frame_name std::vector& Process::simix_processes() { - xbt_assert(mc_mode != MC_MODE_CLIENT); - MC_process_smx_refresh(&mc_model_checker->process()); + this->refresh_simix(); return smx_process_infos; } +std::vector& Process::old_simix_processes() +{ + this->refresh_simix(); + return smx_old_process_infos; +} + +void Process::dumpStack() +{ + unw_addr_space_t as = unw_create_addr_space(&_UPT_accessors, __BYTE_ORDER); + if (as == nullptr) { + XBT_ERROR("Could not initialize ptrace address space"); + return; + } + + void* context = _UPT_create(this->pid_); + if (context == nullptr) { + unw_destroy_addr_space(as); + XBT_ERROR("Could not initialize ptrace context"); + return; + } + + unw_cursor_t cursor; + if (unw_init_remote(&cursor, as, context) != 0) { + _UPT_destroy(context); + unw_destroy_addr_space(as); + XBT_ERROR("Could not initialiez ptrace cursor"); + return; + } + + simgrid::mc::dumpStack(stderr, cursor); + + _UPT_destroy(context); + unw_destroy_addr_space(as); + return; +} + } }