我们有一个带有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,但这两个变量的内存位置相差很远。
答案 0 :(得分:5)
我们怀疑s_var1可能会覆盖c_var2,但这两个变量的内存位置相差很远。
这听起来像某个地方的全局缓冲区溢出。
运行nm -n a.out
,找出附近 c_var2
的变量。然后查找由这些变量引起的溢出。
或者使用Address Sanitizer,它应该能够很容易地为您提供错误的确切位置。
另一种调试方法:在GDB下运行程序,并在c_var2
的地址上设置一个观察点。每次修改c_var2
时都应触发观察点。
如果我在某处添加延迟
如果你的程序是多线程的,那么请注意静态变量和线程不能很好地协同工作。
如果它不是多线程的,我不会看到延迟会如何产生任何影响(除非你也在处理信号)。