死机分析过程,请查看本人博客死机分析之二—如何分析死机原因,这个过程是手动的,包括根据axf文件生成反汇编文件,查找LR,PC对应的代码句子或者函数。如果是使用PSP,则寻找它属于谁的栈空间,确定是在哪个task期间发生的问题,根据状态、屏蔽,错误寄存器的值去查找内核手册确定寄存器值所代表的意思,并根据此具体分析。那么这里面根据log的信息进行解析的过程,它的步奏是固定且清晰的。完全可以由工具来自动化完成而不需要我们手动完成,这样可以节省我们不少时间,而我们可以更加专注于最后的具体分析。

对于嵌入式软件工程师来说,自己手动编写这些分析工具无疑是要化不少时间和精力的。AI其实比我们更加擅长做这种事情,其实我们可以交给AI来编写,本文主要就是探讨如何快速的让AI来编写一个针对自己死机日记的自动化分析工具。

准备准确清晰的上下文信息

主要是有两个方面,一个是自己项目芯片内核对应的寄存器信息,一个是自己死机日志相关的代码和一个实际的死机日志。

准备芯片内核寄存器信息

1、找到内核文档并下载
我这里以ARM cortex-m7举例。首先到ARM资料官网 https://developer.arm.com/search 查找自己芯片内核对应的手册,另外cortex-m7属于ARMv7-M架构,找Armv7-M Architecture Reference Manual 也是可以的。

通常ARM会提供在线文档,也有PDF文档,找到左侧下载图标点击下载

2、找到描述死机相关寄存器的地方并确认页数范围

3、将寄存器相关页数拆分出来单独作为一个文档
如果直接将内核手册抛给AI的话,几百页的东西无疑是会导致上下文不集中,所以我们要手动将将对应的部分拆分出来,这里我大家推荐一个非常好的拆分软件PDF补丁丁 它是一个开源工具,地址 https://github.com/wmjordan/PDFPatcher 他在github上有10k star,它除了可以拆分软件外,还可以破解无法复制,自动或半自动生成书签等,非常好用。
如下图,用它打开要拆分的pdf,并按照下面设置打开新窗口。

将要拆分的页面输入,并选择输出文件,这个时候对应的页面就会重新组合到新的文件,至此寄存器文档资料准备部分结束了。

准备相关代码和一个log

将生成日志的代码及一次输出的死机日志以一并提供给AI,可参考本人开源项目的 https://gitee.com/cyytx/intelligent_lockstm32f7xx_it.c debug.c 文件。

使用AI生成分析工具

我这里选择的AI 是gemini2.5 pro,它支持1m的上下文以及多类型文件,并且有着优秀的能力,首先是将准备的上下文发送给它,同时开启Canvas,这样它会生成文件,也好追溯不同版本。

分解需求

首先,自动化分析死机文件这个需求说简单也不简单,说复杂也不复杂,但是如果一股脑将所有需求一次性提出给AI的话,很难一次成功,调试起来也困难,所以我的建议是先将需求分解成多个,一个功能完成之后,并测试通过之后。先用git 保存起来,之后再给AI提新的需求以此类推。
首先,我们自动化死机分析按照可以拆解成下面多个需求,它本质上也是我们手动操作的序列。

  • 根据路径找到 xxxx.axf 文件,并根据它生成反汇编文件
  • 根据log 中 LR,PC寄存器内容,在反汇编文件中找到它属于的代码句子或者是所属函数。
  • 根据寄存器文档的描述,列出log中状态寄存器PSR及系统控制相关寄存器CONTROL,BASEPRI,PRIMASK,FAULTMASK的值所代表的意思。
  • 根据寄存器文档的描述,分析log中 错误寄存器的值,如果值包含错误相关信息,则输出其值代表的错误信息,如果不包含错误信息,则只需列出原文如CFSR = 0x00000000 不需要列出分析信息。
  • 根据栈地址,和任务信息,分析该地址是否在某个task的栈空间范围内,如属于则输出所在SP地址所所属于的任务,如果则要告知不属于任何任务。

大需求大概就这么多,一些输出优化或其他小需求可以在过程中逐步提出

提供必要背景并清晰表达需求

要想更让AI输出更加符合自己需求的功能和代码,需要把背景如开发环境,开发板芯片等提供给AI,这样才能更好开发。下面是我的提示词

我目前使用STM32F767+Freertos+ keil mdk 在window环境开发一个嵌入式项目,并建立了死机时的日志打印,相关代码在附件的`stm32f7xx_it.c debug.c文件里面,“看门狗超时死机日志.txt”是一个看门狗超时的日志,供你了解。
我想实现一个自动化死机分析的python脚本,初步要求如下。请帮我实现该脚本。
1、从 ../MDK-ARM/目录下找到 smart_lock.axf 文件,并使用它生成反汇编文件,并将生成的反汇编文件保存到本文件的 log目录下。
2、在log目录下找到一个叫crash_log.txt的文件,我将死机日志保存在里面,内容类似于“看门狗超时死机日志.txt” 请读取该文件,并找到LR,PC寄存器内容,在反汇编文件中该内容所属的代码句子或者是所属函数。
3、在log目录下新建一个叫crash_log_analyse_xxxx.txt的文件,其中xxx表示当前时间,精确到秒,并将上面对LR,PC的分析输出到该文件。
4、调用notepad++ 打开crash_log_analyse_xxxx.txt 文件,我的notepad++ 地址为 C:\Program Files\Notepad++\notepad++.exe
5、所有配置相关的代码,如../MDK-ARM/   crash_log.txt 这些保存做变量并尽量放在文件头部,方便我后续查看和修改。

保存成果,迭代开发

将AI 输出的文件保存到本地并命名为 xxxx.py 之后执行试验,当一个功能验证OK时,使用git 保存版本,并告诉AI之前的功能已经完成,目前有新的需求,以此类推,逐步开发。