Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何生成应用程序的崩溃报告?_C_Arm_Rtos_Ds 5 - Fatal编程技术网

C 如何生成应用程序的崩溃报告?

C 如何生成应用程序的崩溃报告?,c,arm,rtos,ds-5,C,Arm,Rtos,Ds 5,目前,我正在使用ARM DS-5 IDE为一个基于ARM的目标设备开发应用程序,并使用ARM编译器工具链RVCT3.1进行编译。 目标设备中使用的线程X RTOS 在目标设备中加载应用程序后,它会在一段时间后意外崩溃。所以我想知道它在哪里崩溃。我需要堆栈转储或跟踪它 在目标硬件上使用AT命令,我能够生成堆栈转储,如下所示 +XLOG: Exception Number: 1 Trap Class: 0xBBBB () System Stack: 0x00000022 0x50263

目前,我正在使用
ARM DS-5 IDE
为一个基于ARM的目标设备开发应用程序,并使用
ARM编译器工具链RVCT3.1
进行编译。 目标设备中使用的线程X RTOS

在目标设备中加载应用程序后,它会在一段时间后意外崩溃。所以我想知道它在哪里崩溃。我需要堆栈转储或跟踪它

在目标硬件上使用AT命令,我能够生成堆栈转储,如下所示

+XLOG: Exception Number: 1
 Trap Class: 0xBBBB ()
 System Stack: 
  0x00000022
  0x502637BC
  0x01000022
  0x00016001
  0xC9FFDF00
  0x000022C1
  0x50310CC0
  0x000022C1
  0x00000049
  0x5025D740
  0x00000002
  0x00000000
  0x680DCF6E
  0x00FF22C0
  0x49F70301
  0x6A552FFB
  0xB104FF3D
  0xCA9895C1
  0x46F4EBA7
  0xAC73DDEA
Date: 2000:1:1
 Time: 0:54:10
 Register:
 r0:  0x00000022  r1:  0x502637BC  r2:  0x01000022
 r3:  0x00016001  r4:  0xC9FFDF00  r5:  0x000022C1
 r6:  0x50310CC0  r7:  0x000022C1  r8:  0x00000049
 r9:  0x5025D740  r10:  0x00000002  r11:  0x00000000
 r12:  0x680DCF6E  r13:  0xFFFF3598  r14:  0x920C10C4
 r15:  0x00FF22C0
 SPSR: 0x80000073  DFAR:  0x00000000  DFSR: 0x00000000
+XLOG: Exception Number: 2
 Trap Class: 0xAAAA ()
 System Stack: 
  0x00000000
  0x5029FC8D
  0x502637C0
  0x00000000
  0xC6FFBF00
  0x000022C1
  0x50310CC0
  0x000022C1
  0x00000049
  0x5025D740
  0x00000002
  0x00000000
  0x5A067AAE
  0x50210B2C
  0x49F70301
  0x6A552FFB
  0xB104FF3D
  0xCA9895C1
  0x46F4EBA7
  0xAC73DDEA
Date: 2000:1:1
 Time: 1:33:6
 Register:
 r0:  0x00000000  r1:  0x5029FC8D  r2:  0x502637C0
 r3:  0x00000000  r4:  0xC6FFBF00  r5:  0x000022C1
 r6:  0x50310CC0  r7:  0x000022C1  r8:  0x00000049
 r9:  0x5025D740  r10:  0x00000002  r11:  0x00000000
 r12:  0x5A067AAE  r13:  0xFFFF3598  r14:  0x920C10C4
 r15:  0x50210B2C
 SPSR: 0x80000053  DFAR:  0xC6FFBF04  DFSR: 0x00000005

如何使用此转储调试问题?如何使用映射文件查找地址?

您的目标硬件是否有MMU?你有像JTAG这样的硬件调试器接口吗?如果两者的答案都是“否”,那么您就有一个大问题。您可以轻松添加通过串行端口打印的调试输出,或者如果硬件具有专用调试端口或JTAG接口,则可以将调试器连接到该端口。因为实时操作系统的问题在于,它们通常在空间和功能有限的系统上运行,崩溃转储很大,生成速度可能较慢。如果您有两个调试打印输出,而您只得到第一个,那么您就知道崩溃发生在两个打印输出之间。然后从这里开始缩小范围,缩小两个打印输出之间的差距,直到一个函数调用为止,然后在函数内部继续缩小范围,直到找到有问题的行为止。在单个函数中,打印函数参数的值以及局部变量的值有助于查找超出范围的空指针或其他无效指针或数组索引。,^^^^^^基本上是一项艰巨的工作。重建、打印、记笔记、分析..protip-如果没有硬件调试器接口,尤其是tasker内核,不要使用嵌入式。这会让你发疯的。