当前位置 : 主页 > 编程语言 > c++ >

在C中调试破坏的静态变量(gdb损坏?)

来源:互联网 收集:自由互联 发布时间:2021-06-23
我已经完成了很多编程,但在C语言上并不多,我需要有关调试的建议.我有一个静态变量(文件范围)在执行多线程程序大约10-100秒后被破坏(在OS X 10.4上使用pthreads).我的代码看起来像这样:
我已经完成了很多编程,但在C语言上并不多,我需要有关调试的建议.我有一个静态变量(文件范围)在执行多线程程序大约10-100秒后被破坏(在OS X 10.4上使用pthreads).我的代码看起来像这样:

static float some_values[SIZE];
static int * addr;

addr指向有效的内存地址一段时间,然后被一些值(有时是0,有时非零)破坏,从而在解除引用时导致段错误.使用gdb进行了调试我已经验证了addr正在人们期望的some_values之后立即在内存中进行布局,所以我的第一个猜测就是我使用了越界索引来写入some_values.但是,这是一个很小的文件,所以很容易检查这不是问题.

明显的调试技术是在变量addr上设置一个观察点.但这样做似乎在gdb中造成了不稳定和无法解释的行为.在第一次分配到addr时触发观察点;然后在我继续执行之后,我立即在另一个线程中得到一个无意义的段错误…据说是在程序的不同部分访问静态变量的地址时的段错误!但是gdb允许我以交互方式读取和写入该内存地址.

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x001d5bd0
0x0000678d in receive (arg=0x0) at mainloop.c:39
39          sample_buf_cleared ++;
(gdb) p &sample_buf_cleared
$17 = (int *) 0x1d5bd0
(gdb) p sample_buf_cleared
$18 = 1
(gdb) set sample_buf_cleared = 2
(gdb) 

gdb显然很困惑.有谁知道为什么?或者有没有人有任何建议调试此错误而不使用观察点?

>您可以在some_values和addr之间放置一个uint数组,并确定您是否超出some_values,或者如果损坏影响更多地址,那么您首先想到的是.我会将填充初始化为DEADBEEF或其他一些易于区分且不太可能在程序中出现的明显模式.如果填充中的值发生更改,则将其强制转换为float,并查看该数字是否有意义.

static float some_values [SIZE];
static unsigned int padding [1024];
static int * addr;

>多次运行程序.在每次运行中禁用一个不同的线程,看看问题何时消失.>将程序进程关联设置为单个核心,然后尝试观察点.如果您没有两个线程同时修改该值,您可能会有更好的运气.注意:此解决方案不排除发生这种情况.它可以更容易捕获调试器.

网友评论