调试正在运行的程序(Keil)

大家好,我是惊觉。接上一篇调试正在运行的程序(STM32CubeIDE),今天Keil的实现方法。调试正在运行的程序,属于附着调试,在启动调试器时不会重置单片机的运行状态,从而可以定位死机等问题。没看过上一篇的同学,建议先回去看一下。

这次随便找了个keil工程进行演示,程序每秒打印一行信息,在5秒后卡死。
在这里插入图片描述
输出结果:

[0] hello
[1] hello
[2] hello
[3] hello
[4] hello
[5] hello

修改配置项

直接进入正题:修改Debug配置。笔者还是使用JLink进行调试。不过与STM32CubeIDE不同,笔者没找到Keil复制调试选项的方法,只能直接修改当前配置了。

在修改调试配置前,不能将Jlink连接单片机。有时点个确认配置的按钮(未启动调试),keil就发送重置命令了。

打开调试配置窗口,切换到Debug选项卡。

取消Load Application at Startup。
在这里插入图片描述
点击Settings以打开Jlink配置窗口。
在这里插入图片描述
在Debug选项卡中,取消红框中的选项
在这里插入图片描述
其实原理与之前一样:

  • 不重启
  • 不下载

启动调试

好了,一路确认。现在可以将Jlink连接单片机,启动调试。
在这里插入图片描述
启动后的调试界面如下,指示当前运行位置的箭头指在了汇编窗口之中,
在这里插入图片描述

需要加载调试信息,在command窗口输入指令LOAD %L INCREMENTAL,敲回车。
在这里插入图片描述
点击黄色箭头,即可显示当前运行的C代码了。如下图,死在了while循环这中。
在这里插入图片描述

刷新栈的内容

不过此时右侧的栈(存放函数和局部变量)是空的。
在这里插入图片描述
经笔者研究发现,此时运行一下,比如运行一步:
在这里插入图片描述
函数栈就有内容了,不过最外层的main函数还是显示为0x00000000,可能有bug吧:)。
在这里插入图片描述
对了,上图的函数栈并不对应文章开头处的代码,因为main函数显示不出来嘛,所以笔者故意多写了几层来测试。

static void test2(void)
{
    static int i = 0;
    
    printf("[%d] hello\r\n", i++);
    
    while(i > 5);
}

static void test1(void)
{
    test2();
}

int main(void)
{
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init(168);
	uart_init(115200);
    
    while (1)
    {
        test1();
        delay_ms(1000);
        
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值