Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
We never use the name of the mailbox
[simgrid.git] / src / mc / Process.cpp
index 12a1499..de390cd 100644 (file)
 #include <stdint.h>
 #include <errno.h>
 
+#include <sys/ptrace.h>
+
+#include <cstdio>
+
 #include <sys/types.h>
 #include <fcntl.h>
 #include <unistd.h>
@@ -177,14 +181,6 @@ static void zero_buffer_init(void)
   close(fd);
 }
 
-static
-int open_process_file(pid_t pid, const char* file, int flags)
-{
-  char buff[50];
-  snprintf(buff, sizeof(buff), "/proc/%li/%s", (long) pid, file);
-  return open(buff, flags);
-}
-
 int open_vm(pid_t pid, int flags)
 {
   const size_t buffer_size = 30;
@@ -242,11 +238,6 @@ Process::~Process()
   }
 
   unw_destroy_addr_space(this->unw_addr_space);
-
-  if (this->clear_refs_fd_ >= 0)
-    close(this->clear_refs_fd_);
-  if (this->pagemap_fd_ >= 0)
-    close(this->pagemap_fd_);
 }
 
 /** Refresh the information about the process
@@ -435,17 +426,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<void> address) const
+std::string Process::read_string(RemotePtr<void> address) const
 {
   if (!address)
-    return nullptr;
+    return {};
 
-  off_t len = 128;
-  char* res = (char*) malloc(len);
+  std::vector<char> 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;
@@ -455,15 +445,13 @@ char* Process::read_string(RemotePtr<void> 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);
   }
 }
 
@@ -573,30 +561,6 @@ void Process::ignore_region(std::uint64_t addr, std::size_t size)
     ignored_regions_.begin() + position, region);
 }
 
-void Process::reset_soft_dirty()
-{
-  if (this->clear_refs_fd_ < 0) {
-    this->clear_refs_fd_ = open_process_file(pid_, "clear_refs", O_WRONLY|O_CLOEXEC);
-    if (this->clear_refs_fd_ < 0)
-      xbt_die("Could not open clear_refs file for soft-dirty tracking. Run as root?");
-  }
-  if(::write(this->clear_refs_fd_, "4\n", 2) != 2)
-    xbt_die("Could not reset softdirty bits");
-}
-
-void Process::read_pagemap(uint64_t* pagemap, size_t page_start, size_t page_count)
-{
-  if (pagemap_fd_ < 0) {
-    pagemap_fd_ = open_process_file(pid_, "pagemap", O_RDONLY|O_CLOEXEC);
-    if (pagemap_fd_ < 0)
-      xbt_die("Could not open pagemap file for soft-dirty tracking. Run as root?");
-  }
-  ssize_t bytesize = sizeof(uint64_t) * page_count;
-  off_t offset = sizeof(uint64_t) * page_start;
-  if (pread_whole(pagemap_fd_, pagemap, bytesize, offset) != bytesize)
-    xbt_die("Could not read pagemap");
-}
-
 void Process::ignore_heap(IgnoredHeapRegion const& region)
 {
   if (ignored_heap_.empty()) {
@@ -680,5 +644,35 @@ std::vector<simgrid::mc::SimixProcessInformation>& Process::old_simix_processes(
   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;
+}
+
 }
 }