Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix link_energy plugin for wifi links
[simgrid.git] / src / mc / remote / RemoteClient.cpp
index 3dea617..93e655a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2019. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2014-2020. 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. */
@@ -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 <fcntl.h>
 #include <libunwind-ptrace.h>
@@ -72,6 +72,7 @@ static const std::vector<std::string> filtered_libraries = {
     "libm",
     "libomp",
     "libpapi",
+    "libpcre2",
     "libpfm",
     "libpgmath",
     "libpthread",
@@ -85,7 +86,30 @@ static const std::vector<std::string> 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)
 {
@@ -196,18 +220,14 @@ void RemoteClient::init()
   this->init_memory_map_info();
 
   int fd = open_vm(this->pid_, O_RDWR);
-  if (fd < 0)
-    xbt_die("Could not open file for process virtual address space");
+  xbt_assert(fd >= 0, "Could not open file for process virtual address space");
   this->memory_file = fd;
 
   // Read std_heap (is a struct mdesc*):
   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)
-    xbt_die("No constant address for this variable");
-  this->read_bytes(&this->heap_address, sizeof(mdesc*), remote(std_heap_var->address),
-                   simgrid::mc::ProcessIndexDisabled);
+  xbt_assert(std_heap_var, "No heap information in the target process");
+  xbt_assert(std_heap_var->address, "No constant address for this variable");
+  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 +261,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 +278,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 +389,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<simgrid::mc::ObjectInformation> const& info = this->binary_info;
@@ -391,6 +410,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,16 +428,11 @@ std::string RemoteClient::read_string(RemotePtr<char> 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);
+    const void* p = memchr(res.data() + off, '\0', c);
     if (p)
       return std::string(res.data());
 
@@ -427,33 +442,8 @@ std::string RemoteClient::read_string(RemotePtr<char> address) const
   }
 }
 
-const void* RemoteClient::read_bytes(void* buffer, std::size_t size, RemotePtr<void> address, int process_index,
-                                     ReadOptions /*options*/) const
+void* RemoteClient::read_bytes(void* buffer, std::size_t size, RemotePtr<void> address, ReadOptions /*options*/) const
 {
-#if HAVE_SMPI
-  if (process_index != simgrid::mc::ProcessIndexDisabled) {
-    std::shared_ptr<simgrid::mc::ObjectInformation> 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_region_t>("smpi_privatization_regions");
-
-      s_smpi_privatization_region_t privatization_region =
-          mc_model_checker->process().read<s_smpi_privatization_region_t>(
-              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;
@@ -494,7 +484,7 @@ void RemoteClient::ignore_region(std::uint64_t addr, std::size_t size)
   }
 
   unsigned int cursor           = 0;
-  IgnoredRegion* current_region = nullptr;
+  const IgnoredRegion* current_region = nullptr;
 
   int start = 0;
   int end   = ignored_regions_.size() - 1;
@@ -543,7 +533,7 @@ void RemoteClient::ignore_heap(IgnoredHeapRegion const& region)
   size_type cursor;
   while (start <= end) {
     cursor               = start + (end - start) / 2;
-    auto& current_region = ignored_heap_[cursor];
+    auto const& current_region = ignored_heap_[cursor];
     if (current_region.address == region.address)
       return;
     else if (current_region.address < region.address)
@@ -572,7 +562,7 @@ void RemoteClient::unignore_heap(void* address, size_t size)
   size_type cursor;
   while (start <= end) {
     cursor       = (start + end) / 2;
-    auto& region = ignored_heap_[cursor];
+    auto const& region = ignored_heap_[cursor];
     if (region.address < address)
       start = cursor + 1;
     else if ((char*)region.address <= ((char*)address + size)) {
@@ -606,7 +596,7 @@ std::vector<simgrid::mc::ActorInformation>& 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) {
@@ -629,7 +619,7 @@ void RemoteClient::dumpStack()
     return;
   }
 
-  simgrid::mc::dumpStack(stderr, std::move(cursor));
+  simgrid::mc::dumpStack(stderr, &cursor);
 
   _UPT_destroy(context);
   unw_destroy_addr_space(as);
@@ -638,9 +628,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;
 }