Merge "Fix malloc debugging for LP64."

This commit is contained in:
Elliott Hughes 2013-10-09 00:20:08 +00:00 committed by Gerrit Code Review
commit 14b66bffb0
2 changed files with 23 additions and 22 deletions

View file

@ -85,11 +85,11 @@ struct hdr_t {
uintptr_t freed_bt[MAX_BACKTRACE_DEPTH];
int freed_bt_depth;
size_t size;
char front_guard[FRONT_GUARD_LEN];
uint8_t front_guard[FRONT_GUARD_LEN];
} __attribute__((packed, aligned(MALLOC_ALIGNMENT)));
struct ftr_t {
char rear_guard[REAR_GUARD_LEN];
uint8_t rear_guard[REAR_GUARD_LEN];
} __attribute__((packed));
static inline ftr_t* to_ftr(hdr_t* hdr) {
@ -126,10 +126,10 @@ static inline void init_front_guard(hdr_t* hdr) {
static inline bool is_front_guard_valid(hdr_t* hdr) {
for (size_t i = 0; i < FRONT_GUARD_LEN; i++) {
if (hdr->front_guard[i] != FRONT_GUARD) {
return 0;
return false;
}
}
return 1;
return true;
}
static inline void init_rear_guard(hdr_t* hdr) {
@ -207,13 +207,14 @@ static inline void poison(hdr_t* hdr) {
memset(user(hdr), FREE_POISON, hdr->size);
}
static int was_used_after_free(hdr_t* hdr) {
unsigned i;
const char* data = reinterpret_cast<const char *>(user(hdr));
for (i = 0; i < hdr->size; i++)
if (data[i] != FREE_POISON)
return 1;
return 0;
static bool was_used_after_free(hdr_t* hdr) {
const uint8_t* data = reinterpret_cast<const uint8_t*>(user(hdr));
for (size_t i = 0; i < hdr->size; i++) {
if (data[i] != FREE_POISON) {
return true;
}
}
return false;
}
/* returns 1 if valid, *safe == 1 if safe to dump stack */

View file

@ -394,9 +394,9 @@ static inline void* mallocdesc_alloc_end(const MallocDesc* desc) {
* code - Event code (one of the TRACE_DEV_XXX).
* val - Event's value parameter.
*/
static inline void notify_qemu(uint32_t code, uint32_t val) {
static inline void notify_qemu(uint32_t code, uintptr_t val) {
if (NULL != qtrace) {
*(volatile uint32_t*)((uint32_t)qtrace + ((code - 1024) << 2)) = val;
*(volatile uintptr_t*)((uintptr_t)qtrace + ((code - 1024) << 2)) = val;
}
}
@ -407,7 +407,7 @@ static inline void notify_qemu(uint32_t code, uint32_t val) {
*/
static void notify_qemu_string(const char* str) {
if (str != NULL) {
notify_qemu(TRACE_DEV_REG_PRINT_USER_STR, (uint32_t)str);
notify_qemu(TRACE_DEV_REG_PRINT_USER_STR, reinterpret_cast<uintptr_t>(str));
}
}
@ -432,7 +432,7 @@ static inline int notify_qemu_malloc(volatile MallocDesc* desc) {
desc->libc_pid = malloc_pid;
desc->allocator_pid = getpid();
desc->av_count = 0;
notify_qemu(TRACE_DEV_REG_MALLOC, (uint32_t)desc);
notify_qemu(TRACE_DEV_REG_MALLOC, reinterpret_cast<uintptr_t>(desc));
/* Emulator reports failure by zeroing libc_pid field of the
* descriptor. */
@ -451,7 +451,7 @@ static inline int notify_qemu_free(void* ptr_to_free) {
free_desc.ptr = ptr_to_free;
free_desc.libc_pid = malloc_pid;
free_desc.free_pid = getpid();
notify_qemu(TRACE_DEV_REG_FREE_PTR, (uint32_t)&free_desc);
notify_qemu(TRACE_DEV_REG_FREE_PTR, reinterpret_cast<uintptr_t>(&free_desc));
/* Emulator reports failure by zeroing libc_pid field of the
* descriptor. */
@ -477,7 +477,7 @@ static inline int query_qemu_malloc_info(const void* ptr, MallocDesc* desc, uint
query.query_pid = getpid();
query.routine = routine;
query.desc = desc;
notify_qemu(TRACE_DEV_REG_QUERY_MALLOC, (uint32_t)&query);
notify_qemu(TRACE_DEV_REG_QUERY_MALLOC, reinterpret_cast<uintptr_t>(&query));
/* Emulator reports failure by zeroing libc_pid field of the
* descriptor. */
@ -534,9 +534,9 @@ static void qemu_log(int prio, const char* fmt, ...) {
static void dump_malloc_descriptor(char* str, size_t str_buf_size, const MallocDesc* desc) {
if (str_buf_size) {
snprintf(str, str_buf_size,
"MDesc: %p: %X <-> %X [%u + %u + %u] by pid=%03u in libc_pid=%03u",
mallocdesc_user_ptr(desc), (uint32_t)desc->ptr,
(uint32_t)mallocdesc_alloc_end(desc), desc->prefix_size,
"MDesc: %p: %p <-> %p [%u + %u + %u] by pid=%03u in libc_pid=%03u",
mallocdesc_user_ptr(desc), desc->ptr,
mallocdesc_alloc_end(desc), desc->prefix_size,
desc->requested_bytes, desc->suffix_size, desc->allocator_pid,
desc->libc_pid);
str[str_buf_size - 1] = '\0';