2013-06-04 42 views
0

我正在研究嵌入式程序。我使用avr-gcc工具链从我的MacBook Pro编译C源代码。直到最近,事情进展得很顺利。尽管如此,在我的最新开发迭代中,我似乎已经引入了一些我怀疑的间歇性错误,这是某种堆栈或其他内存损坏错误。我可以使用Valgrind查找静态内存错误吗?

我从来没有使用Valgrind,但它似乎得到了好评如潮,但大多数引用似乎指的是malloc/free类型的错误。我不做任何malloc'ing。这是一个小巧的嵌入式程序,没有操作系统。 Valgrind能帮助我吗?任何关于如何使用它来帮助在交叉编译的场景中找到静态内存管理错误的指针都会非常有用!

或者我应该看看有不同的工具或技术来验证我的代码的内存管理吗?

+0

您的系统上是否有可用于通过套接字发送调试信息的tcp/ip? –

+0

不,没有以太网硬件。只需三个TTL引脚,我们可以通过FTDI电缆观看,使用良好的'printf'。 –

回答

1

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

+0

进一步观察Valgrind网站,支持的平台操作不会列出atmel avr或真正的任何嵌入式环境。我错过了什么吗? –

+0

@TravisGriggs:你能交叉编译麻烦的代码吗? 86? –

+0

@TravisGriggs您需要交叉编译代码,并在运行valgrind的平台上运行有问题的模块。在一个平台上未定义的行为通常在其他平台上是未定义的行为,所以这个练习可能会有所帮助。 – dasblinkenlight

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

+0

我很高兴能够回到我的机器试用这个! –

+0

@TravisGriggs我很高兴听到这个消息。一个建议虽然:从小开始。除非你使用过其他“正式方法”家族的工具,否则它可能不像你已经熟悉的任何东西。请查看教程,以了解这种功能强大但复杂且笨拙的工作方式:http://frama-c.com/download/value-analysis-Oxygen-20120901.pdf –

+0

安装非常简单。我以root身份安装在正确的位置。并添加了推荐的字体。不幸的是,当我尝试做first.c的教程时,它会发生段错误,脱口说出各种各样的盘子不快乐。我避免使用macports,我假设在发行版中存在一些假设。对我来说,启动Linux VM并在我想象的位置运行此工具可能更容易。 –

相关问题