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