-/* 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 <algorithm>
-#include <cassert>
-#include <cerrno>
-#include <cstddef>
-#include <cstdint>
-#include <string>
-#include <vector>
-
-#include <sys/ptrace.h>
-
-#include <cstdio>
-
-#include <fcntl.h>
-#include <sys/mman.h> // PROT_*
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <pthread.h>
-
-#include <libgen.h>
-
-#include <libunwind-ptrace.h>
-#include <libunwind.h>
+#include "src/mc/remote/RemoteClient.hpp"
-#include "xbt/base.h"
#include "xbt/file.hpp"
#include "xbt/log.h"
-#include <xbt/mmalloc.h>
-
#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 <fcntl.h>
+#include <libunwind-ptrace.h>
+#include <sys/mman.h> // PROT_*
using simgrid::mc::remote;
"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_backtrace",
"libboost_system",
"libboost_thread",
+ "libboost_timer",
+ "libbz2",
"libc",
"libc++",
"libcdt",
"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)
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);
}
if (not address)
return {};
- // TODO, use std::vector with .data() in C++17 to avoid useless copies
std::vector<char> res(128);
off_t off = 0;
}
const void* RemoteClient::read_bytes(void* buffer, std::size_t size, RemotePtr<void> address, int process_index,
- ReadOptions options) const
+ ReadOptions /*options*/) const
{
- if (process_index != simgrid::mc::ProcessIndexDisabled) {
- std::shared_ptr<simgrid::mc::ObjectInformation> 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<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");
size_t offset = address.address() - (std::uint64_t)info->start_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;
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;
}
}
}