0

我们有一个带有 3 个静态变量的函数。这很奇怪,但我们有时会看到 3 个静态变量之一正在重新初始化:

static uchar * Foo( uchar c_par1, uchar c_par2, uchar c_par3 )
{
   static char        s_var1[10];
   static uchar       c_var2     = 0;
   static uchar       c_var3     = 0;
   .....
   return s_var1;
}

在上述情况下, c_var2 有时会重新初始化。

我们确信它已重新初始化,因为我们还打印了每个变量的内存位置,并且它永远不会改变。我们怀疑 s_var1 可能会覆盖 c_var2 但这两个变量的内存位置相距甚远。

4

1 回答 1

5

我们怀疑 s_var1 可能会覆盖 c_var2 但这两个变量的内存位置相距甚远。

这听起来像是某处的全局缓冲区溢出。

运行nm -n a.out,找出附近 c_var2有哪些变量。然后寻找这些变量引起的溢出。

或者使用Address Sanitizer,它应该能够很容易地为您提供错误的确切位置。

另一种调试方法:在 GDB 下运行程序,并在c_var2. 每次c_var2修改时都应触发观察点。

例如,如果我在某处添加延迟

如果您的程序是多线程的,请注意静态变量和线程不能很好地协同工作。

如果它不是多线程的,我看不出延迟会产生什么影响(除非您也在处理信号)。

于 2012-05-17T04:06:46.327 回答