C 我可以使用Valgrind查找静态内存错误吗?

C 我可以使用Valgrind查找静态内存错误吗?,c,embedded,valgrind,avr,atmel,C,Embedded,Valgrind,Avr,Atmel,我在做一个嵌入式程序。我使用AVRCC工具链从MacBookPro编译C源代码。直到最近,一切都进行得相当顺利。但在我最新的开发迭代中,我似乎引入了某种间歇性错误,我怀疑这是某种堆栈或其他内存损坏错误 我从未使用过Valgrind,但它似乎得到了好评,但大多数参考文献似乎都提到了malloc/free类型的错误。我不做任何马洛基舞。这是一个小型嵌入式程序,没有操作系统。瓦尔格林能帮我吗?任何关于如何使用它来帮助发现交叉编译场景中的静态内存管理错误的指针都会非常有用 或者,我是否应该使用其他工具或

我在做一个嵌入式程序。我使用AVRCC工具链从MacBookPro编译C源代码。直到最近,一切都进行得相当顺利。但在我最新的开发迭代中,我似乎引入了某种间歇性错误,我怀疑这是某种堆栈或其他内存损坏错误

我从未使用过Valgrind,但它似乎得到了好评,但大多数参考文献似乎都提到了malloc/free类型的错误。我不做任何马洛基舞。这是一个小型嵌入式程序,没有操作系统。瓦尔格林能帮我吗?任何关于如何使用它来帮助发现交叉编译场景中的静态内存管理错误的指针都会非常有用


或者,我是否应该使用其他工具或技术来验证代码的内存管理?

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

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

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

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

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

(*)但是,如果您提供所有输入并将精度设置为最大值,它可以解释源代码。

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

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

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


(*)虽然如果您提供所有输入并将精度设置为最大值,它可以解释源代码。

如果进一步查看Valgrand站点,支持的平台操作不会列出atmel avr,或者真正的任何嵌入式环境。我是否丢失了什么?@TravisGriggs:您能交叉编译x86之类的麻烦代码吗?@TravisGriggs,您会需要交叉编译您的代码,并在运行valgrind的平台上运行有问题的模块。一个平台上的未定义行为通常是其他平台上的未定义行为,因此此练习可能会有所帮助。是的,这并不是我真正想做的工作(它运行在一个专门的处理器上,直接操作许多特殊用途的寄存器。我真的不想建立一个完整的抽象层,这样它就可以在一个它从来没有打算用于的环境中进行半编译。@TravisGriggs那么我想你必须满足于静态代码分析,或者处理硬件级别的问题调试器。早在我的嵌入式时代(近二十年前),我在PC上测试为8位CPU编写的独立C模块,作为一种“单元测试”。我没有移植整个程序,只移植了一两个模块。这并不简单,但我通过这种方式发现了几个非常严重的逻辑错误。如果其他方法都不起作用,你可能会想尝试这种方法。进一步查看Valgrind网站,受支持的平台操作没有列出atmel avr或任何嵌入式环境。我遗漏了什么吗?@TravisGriggs:你能交叉编译一些麻烦的代码吗?例如x86?@TravisGriggs你需要交叉编译你的代码,并在运行valgrind的平台上运行有问题的模块。一个平台上的未定义行为通常是其他平台上的未定义行为,所以这个练习可能会有所帮助。是的,我认为这并不是一个真正的工作量想做什么(它运行在一个专门的处理器上,直接操作许多特殊用途的寄存器。我真的不想建立一个完整的抽象层,这样它就可以在一个它从来没有打算用于的环境中进行半编译。@TravisGriggs那么我想你必须满足于静态代码分析,或者处理硬件级别的问题调试器。早在我的嵌入式时代(近二十年前),我在PC上测试为8位CPU编写的独立C模块,作为一种“单元测试”。我没有移植整个程序,只移植了一两个模块。这并不简单,但我通过这种方式捕获了几个非常严重的逻辑错误。如果其他方法都不起作用,您可能会想尝试这种方法。我很高兴回到我的机上尝试这种方法