c - 在 C 中调试一个被破坏的静态变量(gdb 坏了?)

标签 c debugging gdb segmentation-fault

我做过很多编程,但用 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 让我可以交互地读取和写入该内存地址。

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 明显糊涂了。有谁知道为什么?或者有人对在不使用观察点的情况下调试此错误有任何建议吗?

最佳答案

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

static float some_values[SIZE]; 静态无符号整数填充[1024]; 静态整数 * 地址;

  1. 多次运行程序。在每次运行中禁用不同的线程并查看问题何时消失。

  2. 将程序进程亲和性设置为单核,然后尝试观察点。如果您没有两个线程同时修改该值,您可能会更幸运。注意:此解决方案并不排除这种情况的发生。它可能更容易在调试器中捕获。

关于c - 在 C 中调试一个被破坏的静态变量(gdb 坏了?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1005059/

相关文章:

Java - 如何在 Eclipse 中检查 'ThreadLocal' 变量的值?

c++ - 如何在事后 gdb session 中查找导致 SEGFAULT 的线程?

iphone - Xcode GDB 无法连接到设备。真的很烦人和烦躁

c - 打印表达式并对其求值的宏(使用 __STRING)

c - 部分功能出现问题

c - Delphi记录: can we do aggregate assignment?

php - 在 codeigniter 中调试路由?

java - 检查 Eclipse 调试器中的当前异常?

c - 分配失败时释放多维数组

c - 当程序可以正常运行但在 gdb 中却不能运行时,会出现什么情况?