@ -188,7 +188,7 @@ AST_MUTEX_DEFINE_STATIC_NOTRACKING(reglock);
} \
} \
} while ( 0 )
} while ( 0 )
static void print_backtrace ( struct ast_bt * bt )
static void print_backtrace ( struct ast_bt * bt , struct ast_cli_args * a )
{
{
int i = 0 ;
int i = 0 ;
struct ast_vector_string * strings ;
struct ast_vector_string * strings ;
@ -198,10 +198,18 @@ static void print_backtrace(struct ast_bt *bt)
}
}
if ( ( strings = ast_bt_get_symbols ( bt - > addresses , bt - > num_frames ) ) ) {
if ( ( strings = ast_bt_get_symbols ( bt - > addresses , bt - > num_frames ) ) ) {
if ( a ) {
ast_cli ( a - > fd , " Memory allocation backtrace: \n " ) ;
} else {
astmm_log ( " Memory allocation backtrace: \n " ) ;
astmm_log ( " Memory allocation backtrace: \n " ) ;
}
for ( i = 3 ; i < AST_VECTOR_SIZE ( strings ) - 2 ; i + + ) {
for ( i = 3 ; i < AST_VECTOR_SIZE ( strings ) - 2 ; 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 ) ) ;
astmm_log ( " #%d: %s \n " , i - 3 , AST_VECTOR_GET ( strings , i ) ) ;
}
}
}
ast_bt_free_symbols ( strings ) ;
ast_bt_free_symbols ( strings ) ;
}
}
}
}
@ -314,7 +322,7 @@ static void region_data_check(struct ast_region *reg)
if ( * pos ! = FREED_MAGIC ) {
if ( * pos ! = FREED_MAGIC ) {
astmm_log ( " WARNING: Memory corrupted after free of %p allocated at %s %s() line %d \n " ,
astmm_log ( " WARNING: Memory corrupted after free of %p allocated at %s %s() line %d \n " ,
reg - > data , reg - > file , reg - > func , reg - > lineno ) ;
reg - > data , reg - > file , reg - > func , reg - > lineno ) ;
print_backtrace ( reg - > bt );
print_backtrace ( reg - > bt , NULL );
my_do_crash ( ) ;
my_do_crash ( ) ;
break ;
break ;
}
}
@ -434,14 +442,14 @@ static void region_check_fences(struct ast_region *reg)
if ( * fence ! = FENCE_MAGIC ) {
if ( * fence ! = FENCE_MAGIC ) {
astmm_log ( " WARNING: Low fence violation of %p allocated at %s %s() line %d \n " ,
astmm_log ( " WARNING: Low fence violation of %p allocated at %s %s() line %d \n " ,
reg - > data , reg - > file , reg - > func , reg - > lineno ) ;
reg - > data , reg - > file , reg - > func , reg - > lineno ) ;
print_backtrace ( reg - > bt );
print_backtrace ( reg - > bt , NULL );
my_do_crash ( ) ;
my_do_crash ( ) ;
}
}
fence = ( unsigned int * ) ( reg - > data + reg - > len ) ;
fence = ( unsigned int * ) ( reg - > data + reg - > len ) ;
if ( get_unaligned_uint32 ( fence ) ! = FENCE_MAGIC ) {
if ( get_unaligned_uint32 ( fence ) ! = FENCE_MAGIC ) {
astmm_log ( " WARNING: High fence violation of %p allocated at %s %s() line %d \n " ,
astmm_log ( " WARNING: High fence violation of %p allocated at %s %s() line %d \n " ,
reg - > data , reg - > file , reg - > func , reg - > lineno ) ;
reg - > data , reg - > file , reg - > func , reg - > lineno ) ;
print_backtrace ( reg - > bt );
print_backtrace ( reg - > bt , NULL );
my_do_crash ( ) ;
my_do_crash ( ) ;
}
}
}
}
@ -880,6 +888,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 " ,
ast_cli ( a - > fd , " %10u bytes allocated%s by %20s() line %5u of %s \n " ,
( unsigned int ) reg - > len , reg - > cache ? " (cache) " : " " ,
( unsigned int ) reg - > len , reg - > cache ? " (cache) " : " " ,
reg - > func , reg - > lineno , reg - > file ) ;
reg - > func , reg - > lineno , reg - > file ) ;
if ( reg - > bt & & ! ast_strlen_zero ( fn ) ) {
print_backtrace ( reg - > bt , a ) ;
}
selected_len + = reg - > len ;
selected_len + = reg - > len ;
if ( reg - > cache ) {
if ( reg - > cache ) {