X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2cc3aadb5b3bba8ec9ae0175a8864acfcbf32e19..9900c8f9847ec57bd5e69aa82ada3c90fa542a56:/src/mc/remote/RemoteClient.cpp diff --git a/src/mc/remote/RemoteClient.cpp b/src/mc/remote/RemoteClient.cpp index 3e7d3e2980..3dea61744e 100644 --- a/src/mc/remote/RemoteClient.cpp +++ b/src/mc/remote/RemoteClient.cpp @@ -1,47 +1,20 @@ -/* Copyright (c) 2014-2017. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2014-2019. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ #define _FILE_OFFSET_BITS 64 /* needed for pread_whole to work as expected on 32bits */ -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include // PROT_* -#include -#include - -#include - -#include - -#include -#include +#include "src/mc/remote/RemoteClient.hpp" -#include "xbt/base.h" #include "xbt/file.hpp" #include "xbt/log.h" -#include - #include "src/mc/mc_smx.hpp" -#include "src/mc/mc_snapshot.hpp" -#include "src/mc/mc_unw.hpp" +#include "src/mc/sosp/mc_snapshot.hpp" -#include "src/mc/AddressSpace.hpp" -#include "src/mc/ObjectInformation.hpp" -#include "src/mc/Variable.hpp" -#include "src/mc/remote/RemoteClient.hpp" +#include +#include +#include // PROT_* using simgrid::mc::remote; @@ -64,16 +37,17 @@ static const std::vector filtered_libraries = { "libthr", /* thread library */ "libutil", #endif - "libasan", /* gcc sanitizers */ "libargp", /* workarounds for glibc-less systems */ - "libtsan", - "libubsan", - "libbz2", + "libasan", /* gcc sanitizers */ "libboost_chrono", "libboost_context", "libboost_context-mt", + "libboost_stacktrace_addr2line", + "libboost_stacktrace_backtrace", "libboost_system", "libboost_thread", + "libboost_timer", + "libbz2", "libc", "libc++", "libcdt", @@ -84,18 +58,33 @@ static const std::vector filtered_libraries = { "libdw", "libelf", "libevent", + "libexecinfo", + "libflang", + "libflangrti", "libgcc_s", + "libgfortran", + "libimf", + "libintlc", + "libirng", "liblua5.1", "liblua5.3", "liblzma", "libm", + "libomp", + "libpapi", + "libpfm", + "libpgmath", "libpthread", + "libquadmath", "librt", "libstdc++", + "libsvml", + "libtsan", /* gcc sanitizers */ + "libubsan", /* gcc sanitizers */ "libunwind", - "libunwind-x86_64", - "libunwind-x86", "libunwind-ptrace", + "libunwind-x86", + "libunwind-x86_64", "libz"}; static bool is_simgrid_lib(const std::string& libname) @@ -110,19 +99,18 @@ static bool is_filtered_lib(const std::string& libname) static std::string get_lib_name(const std::string& pathname) { - constexpr char digits[] = ".0123456789"; - std::string map_basename = simgrid::xbt::Path(pathname).getBasename(); + std::string map_basename = simgrid::xbt::Path(pathname).get_base_name(); std::string libname; size_t pos = map_basename.rfind(".so"); - if (pos != std::string::npos && map_basename.find_first_not_of(digits, pos + 3) == std::string::npos) { - // strip the extension (matching regex "\.so[.0-9]*$") + if (pos != std::string::npos) { + // strip the extension (matching regex "\.so.*$") libname.assign(map_basename, 0, pos); // strip the version suffix (matching regex "-[.0-9-]*$") while (true) { pos = libname.rfind('-'); - if (pos == std::string::npos || libname.find_first_not_of(digits, pos + 1) != std::string::npos) + if (pos == std::string::npos || libname.find_first_not_of(".0123456789", pos + 1) != std::string::npos) break; libname.erase(pos); } @@ -213,7 +201,7 @@ void RemoteClient::init() this->memory_file = fd; // Read std_heap (is a struct mdesc*): - simgrid::mc::Variable* std_heap_var = this->find_variable("__mmalloc_default_mdp"); + const simgrid::mc::Variable* std_heap_var = this->find_variable("__mmalloc_default_mdp"); if (not std_heap_var) xbt_die("No heap information in the target process"); if (not std_heap_var->address) @@ -252,7 +240,7 @@ void RemoteClient::refresh_heap() { // Read/dereference/refresh the std_heap pointer: if (not this->heap) - this->heap = std::unique_ptr(new s_xbt_mheap_t()); + this->heap.reset(new s_xbt_mheap_t()); this->read_bytes(this->heap.get(), sizeof(mdesc), remote(this->heap_address), simgrid::mc::ProcessIndexDisabled); this->cache_flags_ |= RemoteClient::cache_heap; } @@ -378,7 +366,7 @@ simgrid::mc::Frame* RemoteClient::find_function(RemotePtr ip) const /** Find (one occurrence of) the named variable definition */ -simgrid::mc::Variable* RemoteClient::find_variable(const char* name) const +const simgrid::mc::Variable* RemoteClient::find_variable(const char* name) const { // First lookup the variable in the executable shared object. // A global variable used directly by the executable code from a library @@ -386,13 +374,13 @@ simgrid::mc::Variable* RemoteClient::find_variable(const char* name) const // We need to look up the variable in the executable first. if (this->binary_info) { std::shared_ptr const& info = this->binary_info; - simgrid::mc::Variable* var = info->find_variable(name); + const simgrid::mc::Variable* var = info->find_variable(name); if (var) return var; } for (std::shared_ptr const& info : this->object_infos) { - simgrid::mc::Variable* var = info->find_variable(name); + const simgrid::mc::Variable* var = info->find_variable(name); if (var) return var; } @@ -402,7 +390,7 @@ simgrid::mc::Variable* RemoteClient::find_variable(const char* name) const void RemoteClient::read_variable(const char* name, void* target, size_t size) const { - simgrid::mc::Variable* var = this->find_variable(name); + const simgrid::mc::Variable* var = this->find_variable(name); xbt_assert(var->address, "No simple location for this variable"); xbt_assert(var->type->full_type, "Partial type for %s, cannot check size", name); xbt_assert((size_t)var->type->full_type->byte_size == size, "Unexpected size for %s (expected %zu, was %zu)", name, @@ -415,7 +403,6 @@ std::string RemoteClient::read_string(RemotePtr address) const if (not address) return {}; - // TODO, use std::vector with .data() in C++17 to avoid useless copies std::vector res(128); off_t off = 0; @@ -441,12 +428,12 @@ std::string RemoteClient::read_string(RemotePtr address) const } const void* RemoteClient::read_bytes(void* buffer, std::size_t size, RemotePtr address, int process_index, - ReadOptions options) 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. #if HAVE_SMPI + if (process_index != simgrid::mc::ProcessIndexDisabled) { + std::shared_ptr const& info = this->find_object_info_rw(address); + // Segment overlap is not handled. if (info.get() && this->privatized(*info)) { if (process_index < 0) xbt_die("Missing process index"); @@ -465,8 +452,8 @@ const void* RemoteClient::read_bytes(void* buffer, std::size_t size, RemotePtrstart_rw; address = remote((char*)privatization_region.address + offset); } -#endif } +#endif if (pread_whole(this->memory_file, buffer, size, (size_t)address.address()) < 0) xbt_die("Read at %p from process %lli failed", (void*)address.address(), (long long)this->pid_); return buffer; @@ -642,7 +629,7 @@ void RemoteClient::dumpStack() return; } - simgrid::mc::dumpStack(stderr, cursor); + simgrid::mc::dumpStack(stderr, std::move(cursor)); _UPT_destroy(context); unw_destroy_addr_space(as); @@ -650,12 +637,12 @@ void RemoteClient::dumpStack() bool RemoteClient::actor_is_enabled(aid_t pid) { - s_mc_message_actor_enabled msg{MC_MESSAGE_ACTOR_ENABLED, pid}; + s_mc_message_actor_enabled_t msg{MC_MESSAGE_ACTOR_ENABLED, pid}; process()->getChannel().send(msg); char buff[MC_MESSAGE_LENGTH]; ssize_t received = process()->getChannel().receive(buff, MC_MESSAGE_LENGTH, true); - xbt_assert(received == sizeof(s_mc_message_int), "Unexpected size in answer to ACTOR_ENABLED"); - return ((mc_message_int_t*)buff)->value; + xbt_assert(received == sizeof(s_mc_message_int_t), "Unexpected size in answer to ACTOR_ENABLED"); + return ((s_mc_message_int_t*)buff)->value; } } }