0

我正在开发一个嵌入式程序。我使用 avr-gcc 工具链从我的 MacBook Pro 编译 C 源代码。直到最近,事情进展顺利。不过,在我最新的开发迭代中,我似乎引入了某种间歇性错误,我怀疑这是某种堆栈或其他内存损坏错误。

我从未使用过 Valgrind,但它似乎得到了热烈的评价,但大多数参考文献似乎都提到了 malloc/free 类型的错误。我不做任何malloc'ing。这是一个小型嵌入式程序,没有操作系统。Valgrind 可以帮助我吗?任何关于我将如何使用它来帮助在交叉编译场景中查找静态内存管理不善错误的指针都会非常有帮助!

或者我应该考虑使用不同的工具或技术来验证我的代码的内存管理?

4

2 回答 2

2

是的,valgrind 绝对可以帮助你。除了大量基于堆的分析(非法释放、内存泄漏等)外,它的 memcheck 工具还检测非法读写,即程序访问不应访问的内存的情况。此分析不区分静态和动态内存:它会报告堆栈帧之外的访问、超出静态数组边界的访问等等。它还检测对以前未初始化的变量的访问。这两种情况都是未定义的行为,并且可能导致崩溃。

于 2013-06-04T21:36:35.913 回答
2

Frama-C是一个静态分析框架(与提供动态分析的 Valgrind 相对)。它最初的设计考虑了嵌入式的、可能是低级的代码。Frama-C 的“值分析”插件基本上可以检测您在嵌入式代码中可能想了解的所有 C 未定义行为(包括访问无效指针)。

由于它是一个静态分析器,它不执行代码(*),因此在交叉编译的上下文中是理想的。寻找选项-machdep。此选项的值包括 x86_64 x86_32 ppc_32 x86_16。

免责声明:我是Frama-C“价值分析”插件的贡献者之一。

(*) 但是,如果您提供所有输入并将精度设置为最大值,它可以像任何交叉编译+执行一样精确地解释源代码。

于 2013-06-04T21:37:11.400 回答