armink / CmBacktrace

Advanced fault backtrace library for ARM Cortex-M series MCU | ARM Cortex-M 系列 MCU 错误追踪库
MIT License
1.59k stars 640 forks source link

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

Open Mr-Peng-X opened 5 years ago

Mr-Peng-X commented 5 years ago

疑问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