大家好,我是惊觉。接上一篇调试正在运行的程序(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);}
}