unsigned long end_addr;
unsigned long mmap_offset;
char* binary_filename;
+ bool deleted;
};
/*
struct mmap_cache_t *cache_head;
FILE *fp;
+ const char *deleted = " (deleted)";
+ size_t blen;
+ size_t dlen;
+
sprintf(filename, "/proc/%d/maps", tcp->pid);
fp = fopen(filename, "r");
if (!fp) {
cur_entry->mmap_offset = mmap_offset;
cur_entry->binary_filename = strdup(binary_path);
+ dlen = strlen(deleted);
+ blen = strlen(binary_path);
+ if (blen >= dlen && strcmp(binary_path + blen - dlen, deleted) == 0)
+ cur_entry->deleted = true;
+ else
+ cur_entry->deleted = false;
+
/*
* sanity check to make sure that we're storing
* non-overlapping regions in ascending order
char * symbol_name;
struct mmap_cache_t* cur_mmap_cache;
unsigned long true_offset;
+ bool berror_expected = false;
if (!tcp->mmap_cache)
error_msg_and_die("bug: mmap_cache is NULL");
die_out_of_memory();
}
+ if (cur_mmap_cache->deleted)
+ berror_expected = true;
+
true_offset = ip - cur_mmap_cache->start_addr +
cur_mmap_cache->mmap_offset;
if (symbol_name[0]) {
}
if (lower > upper) {
error_action(data,
- "backtracing_error", ip);
+ berror_expected
+ ?"expected_backtracing_error"
+ :"unexpected_backtracing_error",
+ ip);
goto ret;
}