前两天定位一个嵌入式应用的死机问题,过程极为复杂,首先用jlink抓core文件,然后用trace32恢复现场,最后发现是idle线程的任务栈被踩了,但是没法确定是谁踩了这个内存,理论上,靠死机dump也是能恢复出来哪一个操作产生的这个现象,但极为复杂,需要通过SP去恢复其他线程的任务栈,也就是踩内存产生的死机,通常恢复出来都是被踩的任务栈,最后还是得依靠打印日志,走查代码查出是谁干了坏事;
最终,发现异常的代码,是多个相似的结构体,做移位操作的时候,把结构体类型写错了,下面的代码:
代码语言:javascript复制 if (g_tag_sms_manager.cacheSize != 0 && g_tag_sms_manager.cacheStartIndex > 0) {
for(int i= 0; i < g_tag_sms_manager.cacheSize; i ) {
memcpy((void *)&g_tag_sms_manager.brodcastDigest[i], (void *)&g_tag_sms_manager.brodcastDigest[g_tag_sms_manager.cacheStartIndex i],
sizeof(uwb_sms_digest));
}
}
关键在sizeof(uwb_sms_digest),这个地方给的大小决定了拷贝的源和目标的大小,由于这是一段复制粘贴的代码,同事忘了修改这个结构体变量的类型,直接用成了另一个结构体的sizeof(tag_uwb_sms_t),导致读写都越界,后果自然是不可预期了!
作为一个十多年的码农,出现这个低级错误,是不是挺无奈的!而我们的同事说,为了实现这个需求,算法逻辑调试了两周,中间解决了好多的类似的内存问题!
其实,上面的代码和算法也不复杂,就是一个短消息的缓存处理,入队,排序,出队,想到百度最近发布的生成式AI,文心一言,不试不知道,试了发现确实很强大,使用它,不仅能提升生产力,产品的稳定性也有了更大的提升。
文心一言生成的代码:
代码很完整,对问题的理解也很到位,代码也不会有低级问题!
那么,程序员的价值体现在哪里呢?
1、需求理解,拆解问题,提出问题的能力;
也就是给文心一言提出具体的问题,然文心一言给出相应符合要求的代码;
2、系统整合的能力;
毕竟我们开发的不只是一段代码,而是一个复杂的系统,而程序员,就是将这个这些片段的代码,通过合适的接口,封装,组合成一个复杂的系统;
3、如上,如果没有这些能力了,是不是就只能失业了。
悲观者如是说。
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com
- 上一篇:没有了
- 下一篇: DW1000的SPI速率