diff --git a/main/astmm.c b/main/astmm.c index 7dafbacc10..8435d8da8b 100644 --- a/main/astmm.c +++ b/main/astmm.c @@ -185,7 +185,7 @@ void ast_free_ptr(void *ptr) ast_free(ptr); } -static void print_backtrace(struct ast_bt *bt) +static void print_backtrace(struct ast_bt *bt, struct ast_cli_args *a) { int i = 0; struct ast_vector_string *strings; @@ -195,9 +195,17 @@ static void print_backtrace(struct ast_bt *bt) } if ((strings = ast_bt_get_symbols(bt->addresses, bt->num_frames))) { - astmm_log("Memory allocation backtrace:\n"); + if (a) { + ast_cli(a->fd, "Memory allocation backtrace:\n"); + } else { + astmm_log("Memory allocation backtrace:\n"); + } for (i = 3; i < AST_VECTOR_SIZE(strings) - 2; i++) { - astmm_log("#%d: %s\n", i - 3, AST_VECTOR_GET(strings, i)); + if (a) { + ast_cli(a->fd, "#%d: %s\n", i - 3, AST_VECTOR_GET(strings, i)); + } else { + astmm_log("#%d: %s\n", i - 3, AST_VECTOR_GET(strings, i)); + } } ast_bt_free_symbols(strings); } @@ -311,7 +319,7 @@ static void region_data_check(struct ast_region *reg) if (*pos != FREED_MAGIC) { astmm_log("WARNING: Memory corrupted after free of %p allocated at %s %s() line %d\n", reg->data, reg->file, reg->func, reg->lineno); - print_backtrace(reg->bt); + print_backtrace(reg->bt, NULL); my_do_crash(); break; } @@ -431,14 +439,14 @@ static void region_check_fences(struct ast_region *reg) if (*fence != FENCE_MAGIC) { astmm_log("WARNING: Low fence violation of %p allocated at %s %s() line %d\n", reg->data, reg->file, reg->func, reg->lineno); - print_backtrace(reg->bt); + print_backtrace(reg->bt, NULL); my_do_crash(); } fence = (unsigned int *) (reg->data + reg->len); if (get_unaligned_uint32(fence) != FENCE_MAGIC) { astmm_log("WARNING: High fence violation of %p allocated at %s %s() line %d\n", reg->data, reg->file, reg->func, reg->lineno); - print_backtrace(reg->bt); + print_backtrace(reg->bt, NULL); my_do_crash(); } } @@ -882,6 +890,9 @@ static char *handle_memory_show_allocations(struct ast_cli_entry *e, int cmd, st ast_cli(a->fd, "%10u bytes allocated%s by %20s() line %5u of %s\n", (unsigned int) reg->len, reg->cache ? " (cache)" : "", reg->func, reg->lineno, reg->file); + if (reg->bt && !ast_strlen_zero(fn)) { + print_backtrace(reg->bt, a); + } selected_len += reg->len; if (reg->cache) {