fix aarch64 backtrace print
This commit is contained in:
parent
da55491608
commit
df0d8b4230
|
@ -34,52 +34,29 @@ extern long list_thread(void);
|
|||
|
||||
static void _check_fault(struct rt_hw_exp_stack *regs, uint32_t pc_adj, char *info)
|
||||
{
|
||||
uint32_t mode = regs->cpsr;
|
||||
uint32_t is_user_fault;
|
||||
rt_thread_t th;
|
||||
|
||||
if ((mode & 0x1f) == 0x00)
|
||||
is_user_fault = !(regs->cpsr & 0x1f);
|
||||
if (is_user_fault)
|
||||
{
|
||||
rt_kprintf("%s! pc = 0x%x\n", info, regs->pc - pc_adj);
|
||||
}
|
||||
|
||||
/* user stack backtrace */
|
||||
#ifdef RT_USING_LWP
|
||||
{
|
||||
rt_thread_t th;
|
||||
|
||||
th = rt_thread_self();
|
||||
if (th && th->lwp)
|
||||
{
|
||||
arch_backtrace_uthread(th);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* user stack backtrace */
|
||||
th = rt_thread_self();
|
||||
if (th && th->lwp)
|
||||
{
|
||||
arch_backtrace_uthread(th);
|
||||
}
|
||||
|
||||
if (is_user_fault)
|
||||
{
|
||||
#ifdef LWP_USING_CORE_DUMP
|
||||
lwp_core_dump(regs, pc_adj);
|
||||
#endif
|
||||
sys_exit_group(-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* user stack backtrace */
|
||||
#ifdef RT_USING_LWP
|
||||
{
|
||||
rt_thread_t th;
|
||||
|
||||
th = rt_thread_self();
|
||||
if (th && th->lwp)
|
||||
{
|
||||
arch_backtrace_uthread(th);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* kernel stack backtrace */
|
||||
struct rt_hw_backtrace_frame frame = {
|
||||
.fp = regs->x29,
|
||||
.pc = regs->pc
|
||||
};
|
||||
rt_backtrace_frame(&frame);
|
||||
}
|
||||
}
|
||||
|
||||
rt_inline int _get_type(unsigned long esr)
|
||||
|
@ -383,7 +360,6 @@ void rt_hw_trap_exception(struct rt_hw_exp_stack *regs)
|
|||
rt_hw_cpu_shutdown();
|
||||
}
|
||||
|
||||
|
||||
void rt_hw_trap_serror(struct rt_hw_exp_stack *regs)
|
||||
{
|
||||
rt_kprintf("SError\n");
|
||||
|
|
|
@ -93,13 +93,13 @@ rt_weak void rt_hw_cpu_shutdown(void)
|
|||
|
||||
rt_weak rt_err_t rt_hw_backtrace_frame_get(rt_thread_t thread, struct rt_hw_backtrace_frame *frame)
|
||||
{
|
||||
LOG_W("%s: not implemented");
|
||||
LOG_W("%s is not implemented", __func__);
|
||||
return -RT_ENOSYS;
|
||||
}
|
||||
|
||||
rt_weak rt_err_t rt_hw_backtrace_frame_unwind(rt_thread_t thread, struct rt_hw_backtrace_frame *frame)
|
||||
{
|
||||
LOG_W("%s: not implemented");
|
||||
LOG_W("%s is not implemented", __func__);
|
||||
return -RT_ENOSYS;
|
||||
}
|
||||
|
||||
|
@ -1565,7 +1565,8 @@ rt_weak rt_err_t rt_backtrace(void)
|
|||
#else /* otherwise not implemented */
|
||||
rt_weak rt_err_t rt_backtrace(void)
|
||||
{
|
||||
LOG_W("%s: not implemented");
|
||||
/* LOG_W cannot work under this environment */
|
||||
rt_kprintf("%s is not implemented\n", __func__);
|
||||
return -RT_ENOSYS;
|
||||
}
|
||||
#endif
|
||||
|
@ -1573,18 +1574,19 @@ rt_weak rt_err_t rt_backtrace(void)
|
|||
rt_err_t rt_backtrace_frame(struct rt_hw_backtrace_frame *frame)
|
||||
{
|
||||
long nesting = 0;
|
||||
LOG_RAW("please use: addr2line -e rtthread.elf -a -f");
|
||||
|
||||
rt_kprintf("please use: addr2line -e rtthread.elf -a -f\n");
|
||||
|
||||
while (nesting < RT_BACKTRACE_LEVEL_MAX_NR)
|
||||
{
|
||||
LOG_RAW(" 0x%lx", (rt_ubase_t)frame->pc);
|
||||
rt_kprintf(" 0x%lx", (rt_ubase_t)frame->pc);
|
||||
if (rt_hw_backtrace_frame_unwind(rt_thread_self(), frame))
|
||||
{
|
||||
break;
|
||||
}
|
||||
nesting++;
|
||||
}
|
||||
LOG_RAW("\n");
|
||||
rt_kprintf("\n");
|
||||
return RT_EOK;
|
||||
}
|
||||
|
||||
|
@ -1619,7 +1621,7 @@ static void cmd_backtrace(int argc, char** argv)
|
|||
{
|
||||
if (argc == 1)
|
||||
{
|
||||
LOG_RAW("[INFO] No thread specified\n"
|
||||
rt_kprintf("[INFO] No thread specified\n"
|
||||
"[HELP] You can use commands like: backtrace %p\n"
|
||||
"Printing backtrace of calling stack...\n",
|
||||
rt_thread_self());
|
||||
|
@ -1628,7 +1630,7 @@ static void cmd_backtrace(int argc, char** argv)
|
|||
}
|
||||
else
|
||||
{
|
||||
LOG_RAW("please use: backtrace [thread_address]\n");
|
||||
rt_kprintf("please use: backtrace [thread_address]\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1636,18 +1638,18 @@ static void cmd_backtrace(int argc, char** argv)
|
|||
pid = strtoul(argv[1], &end_ptr, 0);
|
||||
if (end_ptr == argv[1])
|
||||
{
|
||||
LOG_RAW("Invalid input: %s\n", argv[1]);
|
||||
rt_kprintf("Invalid input: %s\n", argv[1]);
|
||||
return ;
|
||||
}
|
||||
|
||||
if (pid && rt_object_get_type((void *)pid) == RT_Object_Class_Thread)
|
||||
{
|
||||
rt_thread_t target = (rt_thread_t)pid;
|
||||
LOG_RAW("backtrace %s(0x%lx), from %s\n", target->parent.name, pid, argv[1]);
|
||||
rt_kprintf("backtrace %s(0x%lx), from %s\n", target->parent.name, pid, argv[1]);
|
||||
rt_backtrace_thread(target);
|
||||
}
|
||||
else
|
||||
LOG_RAW("Invalid pid: %ld\n", pid);
|
||||
rt_kprintf("Invalid pid: %ld\n", pid);
|
||||
}
|
||||
MSH_CMD_EXPORT_ALIAS(cmd_backtrace, backtrace, print backtrace of a thread);
|
||||
|
||||
|
|
Loading…
Reference in New Issue