我已经做了很多编程,但在 C 语言中并不多,我需要有关调试的建议。我有一个静态变量(文件范围),在执行多线程程序(在 OS X 10.4 上使用 pthreads)大约 10-100 秒后被破坏。我的代码看起来像这样:
static float some_values[SIZE];
static int * addr;
addr
指向有效的内存地址一段时间,然后被某个值(有时为 0,有时为非零)破坏,从而在取消引用时导致段错误。gdb
我已经证实,正如人们所期望的那样,它addr
立即被布置在内存中some_values
,所以我的第一个猜测是我使用了一个越界索引来写入some_values
. 但是,这是一个很小的文件,因此很容易检查这不是问题所在。
显而易见的调试技术是在变量上设置观察点addr
。但这样做似乎会在gdb
. 观察点在第一次分配时被触发addr
;然后在我继续执行之后,我立即在另一个线程中得到一个无意义的段错误......据说是在访问程序不同部分中的静态变量的地址时出现段错误!但是然后gdb
让我以交互方式读取和写入该内存地址。
程序收到信号 EXC_BAD_ACCESS,无法访问内存。 原因:KERN_PROTECTION_FAILURE 地址:0x001d5bd0 0x0000678d 在 mainloop.c:39 处接收(arg=0x0) 39 sample_buf_cleared ++; (gdb) p &sample_buf_cleared $17 = (int *) 0x1d5bd0 (gdb) p sample_buf_cleared 18 美元 = 1 (gdb) 设置 sample_buf_cleared = 2 (gdb)
gdb
显然很困惑。有谁知道为什么?或者有人对不使用观察点调试此错误有任何建议吗?