我正在开发一个嵌入式程序。我使用avr-gcc工具链从我的MacBook Pro编译C源代码。直到最近,事情进展顺利。在我最近的开发迭代中,我似乎已经介绍了某种间歇性错误,我怀疑是某种堆栈或其他内存损坏错误。
我从未使用过Valgrind,但它似乎得到了好评,但大多数引用似乎都引用了malloc / free类型的错误。我不做任何malloc'ing。这是一个小型的嵌入式程序,没有操作系统。 Valgrind可以帮助我吗?关于如何使用它来帮助在交叉编译的场景中找到静态内存管理不善错误的任何指针都会非常有用!
或者我应该考虑使用不同的工具或技术来验证代码的内存管理?
答案 0 :(得分:2)
是的,valgrind绝对可以帮到你。除了大量基于堆的分析(非法释放,内存泄漏等)之外,其memcheck工具还会检测非法读写,即程序访问不应访问的内存时的情况。此分析不区分静态和动态内存:它会报告堆栈帧外的访问,访问静态数组的边界,等等。它还检测对先前未初始化的变量的访问。这两种情况都是未定义的行为,并且可能导致崩溃。
答案 1 :(得分:2)
Frama-C是一个静态分析框架(与提供动态分析的Valgrind相对)。它最初设计时考虑了嵌入式,可能是低级代码。 Frama-C的“值分析”插件基本上可以检测您在嵌入式代码中可能想要了解的所有C未定义行为(包括访问无效指针)。
由于它是静态分析器,因此它不执行代码(*),因此在交叉编译的上下文中是理想的。寻找选项-machdep
。此选项的值包括x86_64 x86_32 ppc_32 x86_16。
免责声明:我是Frama-C“价值分析”插件的贡献者之一。
(*)虽然如果你提供所有输入并设置最大精度,它可以解释源代码as precisely as any cross-compilation+execution would。