Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Small cleanups in mc::Snapshot
[simgrid.git] / src / mc / remote / RemoteProcess.cpp
index eb8275f..75a610d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2021. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2014-2022. 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. */
 #include <memory>
 #include <mutex>
 #include <string>
-
-using simgrid::mc::remote;
+#include <string_view>
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_process, mc, "MC process information");
 
-namespace simgrid {
-namespace mc {
+namespace simgrid::mc {
 
 // ***** Helper stuff
 
-// List of library which memory segments are not considered:
-static const std::vector<std::string> filtered_libraries = {
-#ifdef __linux__
-    "ld",
-#elif defined __FreeBSD__
-    "ld-elf",
-    "ld-elf32",
-    "libkvm",      /* kernel data access library */
-    "libprocstat", /* process and file information retrieval */
-    "libthr",      /* thread library */
-    "libutil",
-#endif
-    "libargp", /* workarounds for glibc-less systems */
-    "libasan", /* gcc sanitizers */
-    "libasn1",
-    "libboost_chrono",
-    "libboost_context",
-    "libboost_context-mt",
-    "libboost_stacktrace_addr2line",
-    "libboost_stacktrace_backtrace",
-    "libboost_system",
-    "libboost_thread",
-    "libboost_timer",
-    "libbrotlicommon",
-    "libbrotlidec",
-    "libbz2",
-    "libc",
-    "libc++",
-    "libcdt",
-    "libcgraph",
-    "libcom_err",
-    "libcrypt",
-    "libcrypto",
-    "libcurl",
-    "libcurl-gnutls",
-    "libcxxrt",
-    "libdebuginfod",
-    "libdl",
-    "libdw",
-    "libelf",
-    "libevent",
-    "libexecinfo",
-    "libffi",
-    "libflang",
-    "libflangrti",
-    "libgcc_s",
-    "libgmp",
-    "libgnutls",
-    "libgcrypt",
-    "libgfortran",
-    "libgpg-error",
-    "libgssapi",
-    "libgssapi_krb5",
-    "libhcrypto",
-    "libheimbase",
-    "libheimntlm",
-    "libhx509",
-    "libhogweed",
-    "libidn2",
-    "libimf",
-    "libintlc",
-    "libirng",
-    "libk5crypto",
-    "libkeyutils",
-    "libkrb5",
-    "libkrb5support", /*odd behaviour on fedora rawhide ... remove these when fixed*/
-    "liblber",
-    "libldap",
-    "libldap_r",
-    "liblua5.1",
-    "liblua5.3",
-    "liblzma",
-    "libm",
-    "libmd",
-    "libnettle",
-    "libnghttp2",
-    "libomp",
-    "libp11-kit",
-    "libpapi",
-    "libpcre2",
-    "libpfm",
-    "libpgmath",
-    "libpsl",
-    "libpthread",
-    "libquadmath",
-    "libresolv",
-    "libroken",
-    "librt",
-    "librtmp",
-    "libsasl2",
-    "libselinux",
-    "libsqlite3",
-    "libssh",
-    "libssh2",
-    "libssl",
-    "libstdc++",
-    "libsvml",
-    "libtasn1",
-    "libtsan",  /* gcc sanitizers */
-    "libubsan", /* gcc sanitizers */
-    "libunistring",
-    "libunwind",
-    "libunwind-ptrace",
-    "libunwind-x86",
-    "libunwind-x86_64",
-    "libwind",
-    "libz",
-    "libzstd"};
-
-static bool is_filtered_lib(const std::string& libname)
+static bool is_filtered_lib(std::string_view libname)
 {
-  return std::find(begin(filtered_libraries), end(filtered_libraries), libname) != end(filtered_libraries);
+  return libname != "libsimgrid";
 }
 
 static std::string get_lib_name(const std::string& pathname)
@@ -150,8 +39,7 @@ static std::string get_lib_name(const std::string& pathname)
   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) {
+  if (size_t pos = map_basename.rfind(".so"); pos != std::string::npos) {
     // strip the extension (matching regex "\.so.*$")
     libname.assign(map_basename, 0, pos);
 
@@ -217,13 +105,10 @@ int open_vm(pid_t pid, int flags)
 
 RemoteProcess::RemoteProcess(pid_t pid) : AddressSpace(this), pid_(pid), running_(true) {}
 
-void RemoteProcess::init(xbt_mheap_t mmalloc_default_mdp, unsigned long* maxpid, xbt_dynar_t actors,
-                         xbt_dynar_t dead_actors)
+void RemoteProcess::init(xbt_mheap_t mmalloc_default_mdp, unsigned long* maxpid)
 {
   this->heap_address      = remote(mmalloc_default_mdp);
   this->maxpid_addr_      = remote(maxpid);
-  this->actors_addr_      = remote(actors);
-  this->dead_actors_addr_ = remote(dead_actors);
 
   this->memory_map_ = simgrid::xbt::get_memory_map(this->pid_);
   this->init_memory_map_info();
@@ -232,8 +117,6 @@ void RemoteProcess::init(xbt_mheap_t mmalloc_default_mdp, unsigned long* maxpid,
   xbt_assert(fd >= 0, "Could not open file for process virtual address space");
   this->memory_file = fd;
 
-  this->smx_actors_infos.clear();
-  this->smx_dead_actors_infos.clear();
   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_);
@@ -262,8 +145,6 @@ RemoteProcess::~RemoteProcess()
 void RemoteProcess::refresh_heap()
 {
   // Read/dereference/refresh the std_heap pointer:
-  if (not this->heap)
-    this->heap = std::make_unique<s_xbt_mheap_t>();
   this->read(this->heap.get(), this->heap_address);
   this->cache_flags_ |= RemoteProcess::cache_heap;
 }
@@ -284,6 +165,10 @@ void RemoteProcess::refresh_malloc_info()
   this->read_bytes(this->heap_info.data(), count * sizeof(malloc_info), remote(this->heap->heapinfo));
   this->cache_flags_ |= RemoteProcess::cache_malloc;
 }
+std::size_t RemoteProcess::get_remote_heap_bytes()
+{
+  return mmalloc_get_bytes_used_remote(get_heap()->heaplimit, get_malloc_info());
+}
 
 /** @brief Finds the range of the different memory segments and binary paths */
 void RemoteProcess::init_memory_map_info()
@@ -291,15 +176,13 @@ void RemoteProcess::init_memory_map_info()
   XBT_DEBUG("Get debug information ...");
   this->maestro_stack_start_ = nullptr;
   this->maestro_stack_end_   = nullptr;
-  this->object_infos.resize(0);
+  this->object_infos.clear();
   this->binary_info = nullptr;
 
   std::vector<simgrid::xbt::VmMap> const& maps = this->memory_map_;
 
   const char* current_name = nullptr;
 
-  this->object_infos.clear();
-
   for (size_t i = 0; i < maps.size(); i++) {
     simgrid::xbt::VmMap const& reg = maps[i];
     const char* pathname           = maps[i].pathname.c_str();
@@ -433,8 +316,7 @@ std::string RemoteProcess::read_string(RemotePtr<char> address) const
       continue;
     xbt_assert(c > 0, "Could not read string from remote process");
 
-    const void* p = memchr(res.data() + off, '\0', c);
-    if (p)
+    if (memchr(res.data() + off, '\0', c))
       return std::string(res.data());
 
     off += c;
@@ -528,18 +410,6 @@ void RemoteProcess::ignore_local_variable(const char* var_name, const char* fram
     info->remove_local_variable(var_name, frame_name);
 }
 
-std::vector<simgrid::mc::ActorInformation>& RemoteProcess::actors()
-{
-  this->refresh_simix();
-  return smx_actors_infos;
-}
-
-std::vector<simgrid::mc::ActorInformation>& RemoteProcess::dead_actors()
-{
-  this->refresh_simix();
-  return smx_dead_actors_infos;
-}
-
 void RemoteProcess::dump_stack() const
 {
   unw_addr_space_t as = unw_create_addr_space(&_UPT_accessors, BYTE_ORDER);
@@ -559,7 +429,7 @@ void RemoteProcess::dump_stack() const
   if (unw_init_remote(&cursor, as, context) != 0) {
     _UPT_destroy(context);
     unw_destroy_addr_space(as);
-    XBT_ERROR("Could not initialiez ptrace cursor");
+    XBT_ERROR("Could not initialize ptrace cursor");
     return;
   }
 
@@ -568,5 +438,4 @@ void RemoteProcess::dump_stack() const
   _UPT_destroy(context);
   unw_destroy_addr_space(as);
 }
-} // namespace mc
-} // namespace simgrid
+} // namespace simgrid::mc