调试绝招—断点

这篇具有很好参考价值的文章主要介绍了调试绝招—断点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对于一些莫名奇妙的错误

未定义异常错误函数 在汇编里面

UsageFault_Handler\

                PROC

                   ; get current context

                   TST           lr, #0x04                               ; if(!EXC_RETURN[2])

                   ITE EQ

                   MRSEQ     r0, msp                               ; [2]=0 ==> Z=1, get fault context from handler.

                   MRSNE     r0, psp                                ; [2]=1 ==> Z=0, get fault context from thread.

                  

                   STMFD     r0!, {r4 - r11}            ; push r4 - r11 register

                   STMFD     r0!, {lr}                                 ; push exec_return register

                  

                   TST           lr, #0x04                               ; if(!EXC_RETURN[2])

                   ITE EQ

                   MSREQ     msp, r0                               ; [2]=0 ==> Z=1, update stack pointer to MSP.

                   MSRNE     psp, r0                                ; [2]=1 ==> Z=0, update stack pointer to PSP.

                  

                   PUSH        {lr}

                   BL              rt_hw_hard_fault_exception

                   POP          {lr}

                  

                   ORR         lr, lr, #0x04

                   BX              lr

                   ENDP

         找到原来的HardFault_Handler函数,替换为一下类容

        

#if 0

void HardFault_Handler(void)

{

  /* USER CODE BEGIN HardFault_IRQn 0 */

  /* USER CODE END HardFault_IRQn 0 */

  while (1)

  {

    /* USER CODE BEGIN W1_HardFault_IRQn 0 */

    /* USER CODE END W1_HardFault_IRQn 0 */

  }

}

#else

#define rt_uint32_t unsigned int

struct exception_info

{

    rt_uint32_t exc_return;

    rt_uint32_t r4;

    rt_uint32_t r5;

    rt_uint32_t r6;

    rt_uint32_t r7;

    rt_uint32_t r8;

    rt_uint32_t r9;

    rt_uint32_t r10;

    rt_uint32_t r11;

    rt_uint32_t r0;

    rt_uint32_t r1;

    rt_uint32_t r2;

    rt_uint32_t r3;

    rt_uint32_t r12;

    rt_uint32_t lr;

    rt_uint32_t pc;

    rt_uint32_t psr;

};

/*

 * fault exception handler

 */

void rt_hw_hard_fault_exception(struct exception_info * exception_info)

{

         unsigned int *app_sp;

         int i;

         app_sp = (unsigned int *)(exception_info + 1);  /* context + 16*4 */

        

    printf("psr: 0x%08x\r\n", exception_info->psr);

    printf("r00: 0x%08x\r\n", exception_info->r0);

    printf("r01: 0x%08x\r\n", exception_info->r1);

    printf("r02: 0x%08x\r\n", exception_info->r2);

    printf("r03: 0x%08x\r\n", exception_info->r3);

    printf("r04: 0x%08x\r\n", exception_info->r4);

    printf("r05: 0x%08x\r\n", exception_info->r5);

    printf("r06: 0x%08x\r\n", exception_info->r6);

    printf("r07: 0x%08x\r\n", exception_info->r7);

    printf("r08: 0x%08x\r\n", exception_info->r8);

    printf("r09: 0x%08x\r\n", exception_info->r9);

    printf("r10: 0x%08x\r\n", exception_info->r10);

    printf("r11: 0x%08x\r\n", exception_info->r11);

    printf("r12: 0x%08x\r\n", exception_info->r12);

    printf(" lr: 0x%08x\r\n", exception_info->lr);

    printf(" pc: 0x%08x\r\n", exception_info->pc);

         printf("stacks: \r\n");

         i = 0;

         for (i = 0; i < 1024; )

         {

                   printf("%08x ", *app_sp);

                   app_sp++;

                   i++;

                   if (i % 16 == 0)

                            printf("\r\n");

                           

         }

         printf("\r\n");

    while (1);

}

#endif

国内体内sne汇编hd,单片机

国内体内sne汇编hd,单片机

国内体内sne汇编hd,单片机

fromelf  --text  -a -c  --output=all.dis    F103_Moduel\F103_Moduel.axf

fromelf  --bin  --output=test.bin F103_Moduel\F103_Moduel.axf

国内体内sne汇编hd,单片机

先要启动这个函数才能定义未定义指令的异常

void UsageFaultInit(void)

{

         SCB->SHCSR |= (SCB_SHCSR_USGFAULTENA_Msk);

}

传入的参数为0,参数被破坏了

国内体内sne汇编hd,单片机

国内体内sne汇编hd,单片机

总结,当函数发生异常时。找到函数的起始地址,查看当前寄存器的值,对着 汇编文件看,文章来源地址https://www.toymoban.com/news/detail-712653.html

到了这里,关于调试绝招—断点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Charles Breakpoints断点调试

    简介 :Breakpoints即断点调试,相当于开发的debug调试,可以修改请求参数、响应数据 场景 :已上线接口做了参数修改,端上暂未修改,可以通过Breakpoints测试接口 实例 :如生产视频接口新增参数,接口很多参数是端上剪辑合成数据,无法简单用postman测试接口,只能通过断点

    2023年04月17日
    浏览(34)
  • Gradle断点调试

    文章链接:https://blog.csdn.net/feather_wch/article/details/131746456 Run/debug configutation中点击加号,选择Remote JVM Debug,默认port 5005,默认名“plugin-debug” Gradle Task中选择assembleDebug,右击 Modify Run Configuration 选择Modify Options 选择Add VM options, 输入“-agentlib:jdwp=transport=dt_socket,server=y,suspend=n

    2024年02月16日
    浏览(50)
  • Idea断点调试(debug)详解

    打断点: 鼠标左键点击这里就会出现一个红点标志 (有各种形状,后续解释),就打上了一个断点。 启动: 对于已经运行过的程序,直接点击,小虫子就能启动 对于没有运行过的程序,找到程序入口(main方法)前面的三角形 ,鼠标右键启动 启动后,当我们的程序执行到

    2024年02月08日
    浏览(58)
  • IDEA debug 断点调试技巧

    1、首先看下IDEA中Debug模式下的界面: ① 以Debug模式启动服务,左边的一个按钮则是以Run模式启动。在开发中,我一般会直接启动Debug模式,方便随时调试代码。 ② 断点:在左边行号栏单击左键,或者快捷键Ctrl+F8 打上/取消断点,断点行的颜色可自己去设置。 ③ Debug窗口:访

    2024年02月15日
    浏览(40)
  • VSCode使用CMake断点调试

    在 VS Code 中使用 CMake 进行断点运行调试,需要进行以下步骤: 确保已在系统中安装了 CMake 和调试器(如 GDB)。 在项目根目录下创建一个名为 .vscode 的文件夹。 在项目根目录下创建一个名为 build 的文件夹,并在终端中导航到该文件夹。 运行以下命令来生成构建文件: 运行

    2024年02月12日
    浏览(38)
  • pycharm 断点调试python Flask

    以flask框架为例,其启动命令为 后面需要拼接runserver 点击开始断点   参考:https://www.cnblogs.com/bigtreei/p/14742015.html

    2024年02月06日
    浏览(38)
  • Chrome浏览器断点调试技巧

    某些情况下,我们必须知道当前代码的执行顺序,以及每一步变量的执行状态来确定代码是否正确按照我们意愿执行。 此时使用断点调试是非常明智的选择。 使用断点调试的第一步,我们需要打开控制台,选择sources,并点击需要调试的文件。 此时在右侧面板可以看到调试操

    2024年02月06日
    浏览(56)
  • unity VS无法进行断点调试

    有时候我们的VS无法进行断点调试,报错如下:  原因是:开启了多个项目,vs无法找到调式项目  解决:点击菜单栏--调试----附加unity调试程序 会弹出一个框,然后选择你要调试的项目  即可

    2024年02月10日
    浏览(49)
  • javascript之debugger与断点调试

    为什么要调试? 程序就是函数堆砌起来的,程序的运行就是函数的执行过程。而通过JS调试,我们可以更为直观的追踪到在程序运行中,函数的执行顺序,以及各个参数的变化。这样我们就可以快速的定位到问题所在。 1. 什么是JS调试? 在程序运行中,我们总会遇到各种bu

    2024年02月04日
    浏览(36)
  • 数学建模-------MATLAB分支循环&&断点调试

    (1)分段函数的引入(这里的数据表示的是分数的不同区间对应的等级) (1)这个就是一个十分简单的if语句,无论是if还是elseif后面都是不能添加任何分号的,这个例子就是一个分段的函数,在不同的区间赋予不同的等级,这里划分了1,2,3,4一共4个等级,只有前面的三个

    2024年04月10日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包