CmBacktrace icon indicating copy to clipboard operation
CmBacktrace copied to clipboard

堆栈溢出检测判断条件疑问

Open Mr-Peng-X opened this issue 7 years ago • 0 comments

疑问1: /* delete saved R0~R3, R12, LR,PC,xPSR registers space */ stack_pointer += sizeof(size_t) * 8;

#if (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M4) || (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M7) stack_pointer = statck_del_fpu_regs(fault_handler_lr, stack_pointer); #endif /* (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M4) || (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M7) */

#ifdef CMB_USING_DUMP_STACK_INFO /* check stack overflow / if (stack_pointer < stack_start_addr || stack_pointer > stack_start_addr + stack_size) { stack_is_overflow = true; } / dump stack information */ dump_stack(stack_start_addr, stack_size, (uint32_t ) stack_pointer); #endif / CMB_USING_DUMP_STACK_INFO / 从任务堆栈跳转到HardFault之前,R0~R3, R12, LR,PC,xPSR等也是需要自动压栈的,这里在先将Sp指针减去这些偏移后再判定是否溢出,觉得有点不妥, (2)cm_backtrace_call_stack函数中 / second depth is from LR, so need decrease a word to PC */ pc = regs.saved.lr - sizeof(size_t); if ((pc >= code_start_addr) && (pc <= code_start_addr + code_size) && (depth < CMB_CALL_STACK_MAX_DEPTH) && (depth < size)) { buffer[depth++] = pc; regs_saved_lr_is_valid = true; } 这里如果是保存lr寄存器的话应该是regs.saved.pc - sizeof(size_t);如果按照上面的,保存的应该是R12。 @armink

Mr-Peng-X avatar Jan 02 '19 08:01 Mr-Peng-X