跟踪内存损坏的特定调试技巧/工具

Specific debugging tips/tools to track down memory corruption?

本文关键字:工具 调试 内存 损坏 跟踪      更新时间:2023-10-16

我正在编写一个简单的视频编码器,用于压缩YUV420p视频。我注意到,当我用相同的压缩设置从相同的输入文件重新生成结果文件时,结果文件看起来总是略有不同。没有大的变化,通常只有几个比特受到"宇宙射线比特翻转"效应的影响。

在我的程序中,我没有使用随机值,所以结果输出应该总是相同的。我怀疑我的程序在它分配的内存之外执行读/写操作,这就解释了数据的随机性。

除了常规的调试实践,是否有特殊的工具/技巧来帮助我检测这些恶作剧的原因?

如果在Windows操作系统,您可以尝试AppVerifier

  • 使用容器的调试变量
  • 使用容器的接口而不是原始内存
  • MallocDebug
  • MallocLogging
  • valgrind
  • MallocScribble
  • 在某些情况下,您可以执行两次操作,您应该期望得到相同的结果-验证结果匹配(注意,您不应该直接比较内存,而是使用接口)。
  • 如果你足够了解所使用的算法,你可以提供一个输入,你可以分析输出的错误(例如:"如果输入是黑帧,输出也应该是黑帧")。

不确定您在哪个平台上开发。上面提到的工具适用于'nix和OS X(也是'nix但是…)

您可以创建一个输出记录,然后创建另一个。在压缩过程中,可以将前者的每个输出位与后者的相同位进行比较。我不知道压缩机。但是,如果您有多个压缩阶段,您可以为第一个结果记录创建多个不同阶段的记录。在压缩第二个结果记录时,需要将每个阶段的位与第一个输出的对应记录的位进行比较。因此,您可以找到损坏比特的特定位置。