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

发布时间:2020-09-16 发布网站:编程之家
编程之家收集整理的这篇文章主要介绍了在C中调试破坏的静态变量(gdb损坏?)编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经完成了很多编程,但在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;

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

总结

以上是编程之家为你收集整理的在C中调试破坏的静态变量(gdb损坏?)全部内容,希望文章能够帮你解决在C中调试破坏的静态变量(gdb损坏?)所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!