X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e47b3e4c9b5ea0bd18d8c088320844200e4ff07e..abf7c33aff8279f498000149d39448946c3297b3:/src/mc/mc_process.c diff --git a/src/mc/mc_process.c b/src/mc/mc_process.c index e3f4eb8378..47c907dbf4 100644 --- a/src/mc/mc_process.c +++ b/src/mc/mc_process.c @@ -405,10 +405,49 @@ void MC_process_read_variable(mc_process_t process, const char* name, void* targ dw_variable_t var = MC_process_find_variable_by_name(process, 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 (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); MC_process_read(process, MC_PROCESS_NO_FLAG, target, var->address, size, MC_PROCESS_INDEX_ANY); } +char* MC_process_read_string(mc_process_t process, void* address) +{ + if (!address) + return NULL; + if (MC_process_is_self(process)) + return strdup((char*) address); + + size_t len = 128; + char* res = malloc(len); + off_t off = 0; + + while (1) { + ssize_t c = pread(process->memory_file, res + off, len - off, (off_t) 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"); + + void* p = memchr(res + off, '\0', c); + if (p) + return res; + + off += c; + if (off == len) { + len *= 2; + res = realloc(res, len); + } + } +} + // ***** Memory access int MC_process_vm_open(pid_t pid, int flags) @@ -507,7 +546,17 @@ const void* MC_process_read_simple(mc_process_t process, { e_adress_space_read_flags_t flags = MC_PROCESS_NO_FLAG; int index = MC_PROCESS_INDEX_ANY; - return MC_process_read(process, flags, local, remote, len, index); + MC_process_read(process, flags, local, remote, len, index); + return local; +} + +const void* MC_process_read_dynar_element(mc_process_t process, + void* local, const void* remote_dynar, size_t i) +{ + s_xbt_dynar_t d; + MC_process_read_simple(process, &d, remote_dynar, sizeof(d)); + MC_process_read_simple(process, local, xbt_dynar_get_ptr(&d, i), i); + return local; } void MC_process_write(mc_process_t process, const void* local, void* remote, size_t len) @@ -520,6 +569,16 @@ void MC_process_write(mc_process_t process, const void* local, void* remote, siz } } +unsigned long MC_process_read_dynar_length(mc_process_t process, const void* remote_dynar) +{ + if (!remote_dynar) + return 0; + unsigned long res; + MC_process_read_simple(process, &res, + &((xbt_dynar_t)remote_dynar)->used, sizeof(res)); + return res; +} + static pthread_once_t zero_buffer_flag = PTHREAD_ONCE_INIT; static const void* zero_buffer; static const int zero_buffer_size = 10 * 4096;