【发布时间】:2009-06-17 04:00:21
【问题描述】:
我做过很多编程,但 C 语言不多,我需要有关调试的建议。我有一个静态变量(文件范围),在执行多线程程序(在 OS X 10.4 上使用 pthreads)大约 10-100 秒后被破坏。我的代码如下所示:
static float some_values[SIZE];
static int * addr;
addr 指向有效的内存地址一段时间,然后被某个值(有时为 0,有时为非零)破坏,从而在取消引用时导致段错误。与gdb 打交道我已经验证addr 在some_values 之后立即被布置在内存中,正如人们所期望的那样,所以我的第一个猜测是我使用了一个越界索引来写入@ 987654326@。但是,这是一个很小的文件,因此很容易检查这不是问题。
显而易见的调试技术是在变量addr 上设置观察点。但这样做似乎会在gdb 中产生不稳定和莫名其妙的行为。观察点在第一次分配给addr 时被触发;然后在我继续执行之后,我立即在另一个线程中得到一个无意义的段错误......据说是在访问程序不同部分中的静态变量的地址时出现段错误!但是gdb 让我可以交互地读取和写入该内存地址。
gdb 显然很困惑。有谁知道为什么?或者有人对不使用观察点调试此错误有任何建议吗?
【问题讨论】:
-
您没有指定 - 这些值中的任何一个是否被超过 1 个线程访问?
-
D'oh 才发现这太老了。
标签: c debugging gdb segmentation-fault