X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b6de662880769ad2cb4c13545bf9a7ceade5ede4..9698e575e77c1df3dcf1614a8404ee0e2ea55778:/src/mc/remote/RemoteClient.cpp diff --git a/src/mc/remote/RemoteClient.cpp b/src/mc/remote/RemoteClient.cpp index 3dea61744e..940d9f9b7e 100644 --- a/src/mc/remote/RemoteClient.cpp +++ b/src/mc/remote/RemoteClient.cpp @@ -7,10 +7,10 @@ #include "src/mc/remote/RemoteClient.hpp" +#include "src/mc/mc_smx.hpp" +#include "src/mc/sosp/Snapshot.hpp" #include "xbt/file.hpp" #include "xbt/log.h" -#include "src/mc/mc_smx.hpp" -#include "src/mc/sosp/mc_snapshot.hpp" #include #include @@ -72,6 +72,7 @@ static const std::vector filtered_libraries = { "libm", "libomp", "libpapi", + "libpcre2", "libpfm", "libpgmath", "libpthread", @@ -85,7 +86,30 @@ static const std::vector filtered_libraries = { "libunwind-ptrace", "libunwind-x86", "libunwind-x86_64", - "libz"}; + "libz", + "libkrb5support", /*odd behaviour on fedora rawhide ... remove these when fixed*/ + "libkeyutils", + "libunistring", + "libbrotlidec", + "liblber", + "libldap", + "libcom_err", + "libk5crypto", + "libkrb5", + "libgssapi_krb5", + "libssl", + "libpsl", + "libssh", + "libidn2", + "libnghttp2", + "libcurl", + "libdebuginfod", + "libbrotlicommon", + "libsasl2", + "libresolv", + "libcrypt", + "libselinux" +}; static bool is_simgrid_lib(const std::string& libname) { @@ -206,8 +230,7 @@ void RemoteClient::init() xbt_die("No heap information in the target process"); if (not std_heap_var->address) xbt_die("No constant address for this variable"); - this->read_bytes(&this->heap_address, sizeof(mdesc*), remote(std_heap_var->address), - simgrid::mc::ProcessIndexDisabled); + this->read_bytes(&this->heap_address, sizeof(mdesc*), remote(std_heap_var->address)); this->smx_actors_infos.clear(); this->smx_dead_actors_infos.clear(); @@ -241,13 +264,13 @@ void RemoteClient::refresh_heap() // Read/dereference/refresh the std_heap pointer: if (not this->heap) this->heap.reset(new s_xbt_mheap_t()); - this->read_bytes(this->heap.get(), sizeof(mdesc), remote(this->heap_address), simgrid::mc::ProcessIndexDisabled); + this->read_bytes(this->heap.get(), sizeof(mdesc), remote(this->heap_address)); this->cache_flags_ |= RemoteClient::cache_heap; } /** Refresh the information about the process * - * Do not use direclty, this is used by the getters when appropriate + * Do not use directly, this is used by the getters when appropriate * in order to have fresh data. * */ void RemoteClient::refresh_malloc_info() @@ -258,8 +281,7 @@ void RemoteClient::refresh_malloc_info() 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->read_bytes(this->heap_info.data(), count * sizeof(malloc_info), remote(this->heap->heapinfo)); this->cache_flags_ |= RemoteClient::cache_malloc; } @@ -370,7 +392,7 @@ 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 - // is reinstanciated in the executable memory .data/.bss. + // is reinstantiated in the executable memory .data/.bss. // We need to look up the variable in the executable first. if (this->binary_info) { std::shared_ptr const& info = this->binary_info; @@ -391,6 +413,7 @@ const simgrid::mc::Variable* RemoteClient::find_variable(const char* name) const void RemoteClient::read_variable(const char* name, void* target, size_t size) const { const simgrid::mc::Variable* var = this->find_variable(name); + xbt_assert(var, "Variable %s not found", 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, @@ -408,14 +431,9 @@ std::string RemoteClient::read_string(RemotePtr address) const while (1) { 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; - else - xbt_die("Could not read from from remote process"); - } - if (c == 0) - xbt_die("Could not read string from remote process"); + if (c == -1 && errno == EINTR) + continue; + xbt_assert(c > 0, "Could not read string from remote process"); void* p = memchr(res.data() + off, '\0', c); if (p) @@ -427,33 +445,8 @@ 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 +void* RemoteClient::read_bytes(void* buffer, std::size_t size, RemotePtr address, ReadOptions /*options*/) const { -#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"); - if (process_index >= (int)MC_smpi_process_count()) - xbt_die("Invalid process index"); - - // Read smpi_privatization_regions from MCed: - smpi_privatization_region_t remote_smpi_privatization_regions = - mc_model_checker->process().read_variable("smpi_privatization_regions"); - - s_smpi_privatization_region_t privatization_region = - mc_model_checker->process().read( - remote(remote_smpi_privatization_regions + process_index)); - - // Address translation in the privatization segment: - size_t offset = address.address() - (std::uint64_t)info->start_rw; - address = remote((char*)privatization_region.address + offset); - } - } -#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; @@ -606,7 +599,7 @@ std::vector& RemoteClient::dead_actors() return smx_dead_actors_infos; } -void RemoteClient::dumpStack() +void RemoteClient::dump_stack() { unw_addr_space_t as = unw_create_addr_space(&_UPT_accessors, BYTE_ORDER); if (as == nullptr) { @@ -638,9 +631,9 @@ void RemoteClient::dumpStack() bool RemoteClient::actor_is_enabled(aid_t pid) { s_mc_message_actor_enabled_t msg{MC_MESSAGE_ACTOR_ENABLED, pid}; - process()->getChannel().send(msg); + process()->get_channel().send(msg); char buff[MC_MESSAGE_LENGTH]; - ssize_t received = process()->getChannel().receive(buff, MC_MESSAGE_LENGTH, true); + ssize_t received = process()->get_channel().receive(buff, MC_MESSAGE_LENGTH, true); xbt_assert(received == sizeof(s_mc_message_int_t), "Unexpected size in answer to ACTOR_ENABLED"); return ((s_mc_message_int_t*)buff)->value; }