解决段错误,系统应用coredump的分析

更新时间:2023-07-07 04:39:07 阅读: 评论:0

解决段错误,系统应⽤coredump的分析
解决段错误,系统应⽤core dump的分析
这个错误在单⽚机上往往以hardfault的错误出现,分析思路都是分析堆栈的位置;
单⽚机的编译软件,如果可以仿真(⽐如keil或者IAR),复现故障,过程中可以通过在hardfault打断点⽅式,开启堆栈查看⼯具,直接定
dana design
位出错位置;
如果不可以仿真,可以在出错位置(⽐如hardfault函数内),直接⽤串⼝或者其他输出⼯具,输出寄存器的数值,以⽅便定位出错的代码
位置;⽐如下⽅的⽅式
//1.关于HardFault_Handler 这个函数,⼀般在stm32_f4xx.s的中断向量表中系统中的代码如下所⽰
g_pfnVectors:
.word  _estack
.word  Ret_Handler2016年考研英语
.word  NMI_Handler
.word  HardFault_Handler  //
.word  MemManage_Handler
.word  BusFault_Handler
.word  UsageFault_Handler
//2.实体如下:⼀般为空,在其中添加如下
void HardFault_Handler(void)
99宿舍六级查询
{
asm("TST LR, #4");//TST 是Bit级别的与操作
asm("ITE EQ");
cani
/
*ITE 是 MRSEQ和MRSNE都是两个命令的合体,分别可以拆开成:MRS,EQ和MRS,NE,分别的意思是如果两者相等,则把MSP的值赋值到R0,如果R0和PSP不    asm("MRSEQ R0, MSP");
asm("MRSNE R0, PSP");
宜昌教育网
asm("B HardFault_HandlerC"); //在此定义跳转函数 hard_fault_handler_c
}
//不⽤asm汇编调⽤,也可以直接在stm32_f4xx.s中定义.cpu cortex-m3
.thumb
.global HardFault_Handler
.extern hard_fault_handler_c
HardFault_Handler:
TST LR, #4
ITE EQ
MRSEQ R0, MSP
MRSNE R0, PSP
B hard_fault_handler_c //在此定义跳转函数 hard_fault_handler_c
//3.实现跳转函数 hard_fault_handler_c
oid hard_fault_handler_c (unsigned int * hardfault_args)
{
unsigned int stacked_r0;
unsigned int stacked_r1;
unsigned int stacked_r2;
unsigned int stacked_r3;
unsigned int stacked_r12;
unsigned int stacked_lr;
unsigned int stacked_pc;
unsigned int stacked_psr;
stacked_r0 = ((unsigned long) hardfault_args[0]);
stacked_r1 = ((unsigned long) hardfault_args[1]);
stacked_r2 = ((unsigned long) hardfault_args[2]);
零基础学英语stacked_r3 = ((unsigned long) hardfault_args[3]);
stacked_r12 = ((unsigned long) hardfault_args[4]);
stacked_lr = ((unsigned long) hardfault_args[5]);
stacked_pc = ((unsigned long) hardfault_args[6]);
stacked_psr = ((unsigned long) hardfault_args[7]);
stacked_psr = ((unsigned long) hardfault_args[7]);
printf ("\n\n[Hard fault handler - all numbers in hex]\n");
printf (“R0 = %x\n”, stacked_r0);
printf (“R1 = %x\n”, stacked_r1);
printf (“R2 = %x\n”, stacked_r2);
printf (“R3 = %x\n”, stacked_r3);
printf (“R12 = %x\n”, stacked_r12);
ikp
printf (“LR [R14] = %x subroutine call return address\n”, stacked_lr);
printf (“PC [R15] = %x program counter\n”, stacked_pc);
printf (“PSR = %x\n”, stacked_psr);
printf (“BFAR = %x\n”, (*((volatile unsigned long )(0xE000ED38))));
printf (“CFSR = %x\n”, (((volatile unsigned long )(0xE000ED28))));
printf (“HFSR = %x\n”, (((volatile unsigned long )(0xE000ED2C))));
printf (“DFSR = %x\n”, (((volatile unsigned long )(0xE000ED30))));redo
printf (“AFSR = %x\n”, (((volatile unsigned long *)(0xE000ED3C))));
printf (“SCB_SHCSR = %x\n”, SCB->SHCSR);
while (1);
}
//此中,如果没有串⼝或其他输出途径,根据需要可以加⼊参数保存进⼊flash;、
出现异常时的寄存器、堆栈、状态寄存器等信息打印出来,然后根据编译器⽣成的map ⽂件,找到出现问题的具体函数:查看⽅式-->
2.linux--借助crash⽂件--core⽂件来查找⽂件
(1)pc-gdb环境搭建
(2)开发板--gdbrver搭建
(3)pc和开发板的⽹络正常
(4)开启core dump开关(ulimite -a),然后直接运⾏程序(如果在线调试需要gdbrver在开发板运⾏),复现故障,产⽣core⽂件(在线调试不需要该⽂件了),将core⽂件 通过pc的gdb调试开发查看dump原因
具体如下
1.⼀般交叉编译已经⾃带了 gdb 和 gdbrver,因此可以不⽤移植,直接使⽤交叉编译器⾃带
队长的英文
的即可。⽐如本教程所使⽤的 arm-linux-gnueabihf-gcc 就⾃带了主机使⽤的 arm-linux-gnueabihfgdb 和开发板所使⽤的gdbrver。进⼊ ubuntu 中交叉编译器安装⽬录中的 bin ⽂件夹下,⽐如笔者的就是/usr/local/arm/gcc-linaro-4.9.4-2017.01-
x86_64_arm-linux-gnueabihf/bin,此⽬录中就包含了 arm-linux-gnueabihf-gdb 和 gdbrve
如果交叉编译器没有⾃带 gdb 和 gdbrver 那就需要⾃⼰⼿动编译了
改进英文
...此处省略...具体看⽹上。。。
直接到第四步:|默认在根⽬录下
arm-linux-gdb /nfsroot/kf-can_app /nfsroot/core输⼊后再输⼊where指令就可以查看堆栈信息了;

本文发布于:2023-07-07 04:39:07,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/169598.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:Sheet stacker
标签:堆栈   查看   调试
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图