diff --git a/rt-thread-version/rt-thread-standard/application-note/debug/cmbacktrace/an0013-CmBacktrace.md b/rt-thread-version/rt-thread-standard/application-note/debug/cmbacktrace/an0013-CmBacktrace.md index 94f25baa1deba8492c089b4639c900b7423ded82..19e1366a8a1e35c738b239f0215ca022aab4de76 100644 --- a/rt-thread-version/rt-thread-standard/application-note/debug/cmbacktrace/an0013-CmBacktrace.md +++ b/rt-thread-version/rt-thread-standard/application-note/debug/cmbacktrace/an0013-CmBacktrace.md @@ -4,9 +4,9 @@ ## 简介 -对于从 C51 、MSP430 等简单单片机转而使用更加复杂的 ARM 新人来说,时不时出现的 "hard falut" 死机会让新人瞬间懵掉。定位错误的方法也往往是连接上仿真器,一步步 F10/F11 单步,定位到具体的错误代码,再去猜测、排除、推敲错误原因,这种过程十分痛苦,且花费的时间很长。 当然,也有部分开发者通过故障寄存器信息来定位故障原因及故障代码地址,虽然这样能解决一小部分问题,但是重复的、繁琐的分析过程也会耽误很多时间。而且对于一些复杂问题,只依靠代码地址是无法解决的,必须得还原错误现场的函数调用逻辑关系。虽然连接仿真器可以查看到的函数调用栈,但故障状态下是无法显示的,所以还是得一步步 F10/F11 单步去定位错误代码的位置。另外,很多产品真机调试时必须断开仿真器,这又使定位错误代码雪上加霜。 +对于从 C51 、MSP430 等简单单片机转而使用更加复杂的 ARM 新人来说,时不时出现的 "hard fault" 死机会让新人瞬间懵掉。定位错误的方法也往往是连接上仿真器,一步步 F10/F11 单步,定位到具体的错误代码,再去猜测、排除、推敲错误原因,这种过程十分痛苦,且花费的时间很长。 当然,也有部分开发者通过故障寄存器信息来定位故障原因及故障代码地址,虽然这样能解决一小部分问题,但是重复的、繁琐的分析过程也会耽误很多时间。而且对于一些复杂问题,只依靠代码地址是无法解决的,必须得还原错误现场的函数调用逻辑关系。虽然连接仿真器可以查看到的函数调用栈,但故障状态下是无法显示的,所以还是得一步步 F10/F11 单步去定位错误代码的位置。另外,很多产品真机调试时必须断开仿真器,这又使定位错误代码雪上加霜。 -为了能让开发者更快的知道造成 hard falut 的原因,更快的定位到错误代码的位置,本文将一步步介绍 CmBacktrace 的相关知识和使用方法,让开发者能不费吹灰之力就找出代码中的问题所在。 +为了能让开发者更快的知道造成 hard fault 的原因,更快的定位到错误代码的位置,本文将一步步介绍 CmBacktrace 的相关知识和使用方法,让开发者能不费吹灰之力就找出代码中的问题所在。 本文准备资料如下: @@ -186,7 +186,7 @@ Show more call stack info by run: addr2line -e rtthread-imxrt.axf -a -f 6000c5c8 ``` -CmBacktrace 首先打印出了发生 hard falut 时的所有线程信息,接着打印了固件名字和软硬件版本号,再打印了错误是发生在 tshell 这个线程里面的(因为我们是在 tshell 这个线程里调用的除零测试函数),紧接着打印的是线程的栈信息和寄存器信息。最后两行信息是最重要的,倒数第二行介绍了发生故障的原因,是因为除零造成的。最后一行提示如果需要获取函数调用栈,需要在 addr2line 中运行 CmBacktrace 给出的参数。 +CmBacktrace 首先打印出了发生 hard fault 时的所有线程信息,接着打印了固件名字和软硬件版本号,再打印了错误是发生在 tshell 这个线程里面的(因为我们是在 tshell 这个线程里调用的除零测试函数),紧接着打印的是线程的栈信息和寄存器信息。最后两行信息是最重要的,倒数第二行介绍了发生故障的原因,是因为除零造成的。最后一行提示如果需要获取函数调用栈,需要在 addr2line 中运行 CmBacktrace 给出的参数。 在使用 addr2line 之前我们要先确认保存了工程对象文件的文件夹位置。使用 mdk 的开发者,可以在 Options -> Output 面板中查看,设置对象文件的保存路径。