#define SO_RE "\\.so[\\.0-9]*$"
#define VERSION_RE "-[\\.0-9-]*$"
-// In lexicographic order (but this is currently not used in the code):
-static const char *const filtered_libraries[] = {
- "ld",
- "libbz2",
- "libboost_chrono",
- "libboost_context",
- "libboost_system",
- "libboost_thread",
- "libc",
- "libc++",
- "libcdt",
- "libcgraph",
- "libdl",
- "libdw",
- "libelf",
- "libgcc_s",
- "liblua5.1",
- "liblua5.3",
- "liblzma",
- "libm",
- "libpthread",
- "librt",
- "libsigc",
- "libstdc++",
- "libunwind",
- "libunwind-x86_64",
- "libunwind-x86",
- "libunwind-ptrace",
- "libz"
-};
+// List of library which memory segments are not considered:
+static const char* const 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
+ "libasan", /* gcc sanitizers */
+ "libargp", /* workarounds for glibc-less systems */
+ "libtsan",
+ "libubsan",
+ "libbz2",
+ "libboost_chrono",
+ "libboost_context",
+ "libboost_context-mt",
+ "libboost_system",
+ "libboost_thread",
+ "libc",
+ "libc++",
+ "libcdt",
+ "libcgraph",
+ "libcrypto",
+ "libcxxrt",
+ "libdl",
+ "libdw",
+ "libelf",
+ "libevent",
+ "libgcc_s",
+ "liblua5.1",
+ "liblua5.3",
+ "liblzma",
+ "libm",
+ "libpthread",
+ "librt",
+ "libstdc++",
+ "libunwind",
+ "libunwind-x86_64",
+ "libunwind-x86",
+ "libunwind-ptrace",
+ "libz"};
static bool is_simgrid_lib(const char* libname)
{
- return !strcmp(libname, "libsimgrid");
+ return not strcmp(libname, "libsimgrid");
}
static bool is_filtered_lib(const char* libname)
map_basename = nullptr;
// Strip the version suffix:
- if(libname && !regexec(&res->version_re, libname, 1, &match, 0)) {
+ if (libname && not regexec(&res->version_re, libname, 1, &match, 0)) {
char* temp = libname;
libname = strndup(temp, match.rm_so);
free(temp);
return libname;
}
-static ssize_t pread_whole(int fd, void *buf, size_t count, std::uint64_t offset)
+static ssize_t pread_whole(int fd, void *buf, size_t count, off_t offset)
{
char* buffer = (char*) buf;
ssize_t real_count = count;
while (count) {
- ssize_t res = pread(fd, buffer, count, (std::int64_t) offset);
+ ssize_t res = pread(fd, buffer, count, offset);
if (res > 0) {
count -= res;
buffer += res;
static const void* zero_buffer;
static const size_t zero_buffer_size = 10 * 4096;
-static void zero_buffer_init(void)
+static void zero_buffer_init()
{
int fd = open("/dev/zero", O_RDONLY);
if (fd<0)
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;
// Read std_heap (is a struct mdesc*):
simgrid::mc::Variable* std_heap_var = this->find_variable("__mmalloc_default_mdp");
- if (!std_heap_var)
+ if (not std_heap_var)
xbt_die("No heap information in the target process");
- if(!std_heap_var->address)
+ if (not std_heap_var->address)
xbt_die("No constant address for this variable");
this->read_bytes(&this->heap_address, sizeof(struct mdesc*),
remote(std_heap_var->address),
simgrid::mc::ProcessIndexDisabled);
- this->smx_process_infos.clear();
- this->smx_old_process_infos.clear();
+ 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(
close(this->memory_file);
if (this->unw_underlying_addr_space != unw_local_addr_space) {
- unw_destroy_addr_space(this->unw_underlying_addr_space);
- _UPT_destroy(this->unw_underlying_context);
+ if (this->unw_underlying_addr_space)
+ unw_destroy_addr_space(this->unw_underlying_addr_space);
+ if (this->unw_underlying_context)
+ _UPT_destroy(this->unw_underlying_context);
}
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
*
- * 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 Process::refresh_heap()
{
// Read/dereference/refresh the std_heap pointer:
- if (!this->heap)
+ if (not this->heap)
this->heap = std::unique_ptr<s_xbt_mheap_t>(new s_xbt_mheap_t());
this->read_bytes(this->heap.get(), sizeof(struct mdesc),
remote(this->heap_address), simgrid::mc::ProcessIndexDisabled);
// [stack], [vvar], [vsyscall], [vdso] ...
if (pathname[0] == '[') {
- if ((reg.prot & PROT_WRITE) && !memcmp(pathname, "[stack]", 7)) {
+ if ((reg.prot & PROT_WRITE) && not memcmp(pathname, "[stack]", 7)) {
this->maestro_stack_start_ = remote(reg.start_addr);
this->maestro_stack_end_ = remote(reg.end_addr);
}
if (!(reg.prot & PROT_READ) && (reg.prot & PROT_EXEC))
continue;
- const bool is_executable = !i;
+ const bool is_executable = not i;
char* libname = nullptr;
- if (!is_executable) {
+ if (not is_executable) {
libname = get_lib_name(pathname, &res);
- if(!libname)
+ if (not libname)
continue;
if (is_filtered_lib(libname)) {
free(libname);
regfree(&res.so_re);
regfree(&res.version_re);
- // Resolve time (including accross differents objects):
+ // Resolve time (including across different objects):
for (auto const& object_info : this->object_infos)
postProcessObjectInformation(this, object_info.get());
return info ? info->find_function((void*) ip.address()) : nullptr;
}
-/** Find (one occurence of) the named variable definition
+/** Find (one occurrence of) the named variable definition
*/
simgrid::mc::Variable* Process::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.
- // We need to look up the variable in the execvutable first.
+ // 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;
simgrid::mc::Variable* var = info->find_variable(name);
void Process::read_variable(const char* name, void* target, size_t size) const
{
simgrid::mc::Variable* var = this->find_variable(name);
- if (!var->address)
- xbt_die("No simple location for this variable");
- if (!var->type->full_type)
- xbt_die("Partial type for %s, cannot check size", name);
- if ((size_t) var->type->full_type->byte_size != size)
- xbt_die("Unexpected size for %s (expected %zi, was %zi)",
- name, size, (size_t) var->type->full_type->byte_size);
+ 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 %zi, was %zi)", name,
+ size, (size_t)var->type->full_type->byte_size);
this->read_bytes(target, size, remote(var->address));
}
-std::string Process::read_string(RemotePtr<void> address) const
+std::string Process::read_string(RemotePtr<char> address) const
{
- if (!address)
+ 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;
mc_model_checker->process().read<s_smpi_privatisation_region_t>(
remote(remote_smpi_privatisation_regions + process_index));
- // Address translation in the privaization segment:
+ // Address translation in the privatization segment:
size_t offset = address.address() - (std::uint64_t)info->start_rw;
address = remote((char*)privatisation_region.address + offset);
}
#endif
}
-
- if (pread_whole(this->memory_file, buffer, size, address.address()) < 0)
- xbt_die("Read from process %lli failed", (long long) this->pid_);
+ 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;
}
/** Write data to a process memory
*
- * @param process the process
- * @param local local memory address (source)
- * @param remote target process memory address (target)
- * @param len data size
+ * @param buffer local memory address (source)
+ * @param len data size
+ * @param address target process memory address (target)
*/
void Process::write_bytes(const void* buffer, size_t len, RemotePtr<void> address)
{
- if (pwrite_whole(this->memory_file, buffer, len, address.address()) < 0)
+ if (pwrite_whole(this->memory_file, buffer, len, (size_t)address.address()) < 0)
xbt_die("Write to process %lli failed", (long long) this->pid_);
}
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()) {
info->remove_local_variable(var_name, frame_name);
}
-std::vector<simgrid::mc::SimixProcessInformation>& Process::simix_processes()
+std::vector<simgrid::mc::ActorInformation>& Process::actors()
{
this->refresh_simix();
- return smx_process_infos;
+ return smx_actors_infos;
}
-std::vector<simgrid::mc::SimixProcessInformation>& Process::old_simix_processes()
+std::vector<simgrid::mc::ActorInformation>& Process::dead_actors()
{
this->refresh_simix();
- return smx_old_process_infos;
+ return smx_dead_actors_infos;
}
void Process::dumpStack()
{
- unw_addr_space_t as = unw_create_addr_space(&_UPT_accessors, __BYTE_ORDER);
+ 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;