Xcode C调试在步进时更改指针的值

时间:2012-12-29 15:48:10

标签: c llvm xcode4.5 lldb

我正在调试一个C代码,其中指针指向一个名为board的结构的指针。我正在打印电路板的功能:

static void board_print(board *b){
    int i,j;
    char data;
    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            data = b->data[i * size + j];
            if(data){
                printf("X ");
            }else{
                printf("O ");
            }
        }
        printf("\n");
    }
}

这是奇怪的部分。当我在第一个for循环开始时点击我的断点时,一切正常,我的数据正确,所有指针都工作等,如下所示:

first

然后,我第一次进入循环,i和j等于零,b->data[0]应该是完全有效的,因为它是两步之前。突然,一旦我踏上行data = b->data[i * size + j];,数据指针就会变成空指针。当我执行该行时,我(显然)会遇到错误的访问错误,如下所示:

second

可能是什么原因?我之前使用过C语言,而且我已经掌握了它,但是在使用单线程简单C程序时,我从未见过指针值突然变为null。我使用Apple LLVM Compiler 4.1编译和lldb进行调试,这是XCode 4.5的默认设置。

更新:使用gcc进行编译并使用gdb进行调试时观察到相同的行为。几乎百分之百的恐怖在我身边,但我不知道代码有什么问题..

更新#2:我现在注意到gcc / gdb上有些奇怪的东西了。在执行第data = b->data[i * size + j];行之前,我可以从调试器访问所有内容而没有任何问题。在执行该行之后,我无法完全访问b->data,包括我在步进之前访问过的值:

third

在调试器中成功执行的$4 = ...行之后,我已经跨过该行。然后我有各种寻址错误,如上所示。我真的不知道发生了什么......

更新#3:我注意到一些非常奇怪的事情。在这里,首先看看我实现的修复。当我完全摆脱名为data的变量时,这个开始没有问题:

fourth

现在,仔细查看我使用Update#2上传的屏幕截图:在我为名为data本地变量分配值之后,同时{{1}获取其地址已更改。它看起来像是作业的副作用。但我不知道背后的原因是什么。

1 个答案:

答案 0 :(得分:2)

显然某事/某人改变了董事会结构的属性“数据”。

为什么?我只能看到三个原因:

  • 您的应用程序是多线程的,另一个线程将数据指针更新为NULL(这不是您的情况,您只使用一个线程,抱歉没注意到。)

  • 电路板结构是从堆栈中分配的,但内容不再有效...例如:返回局部变量的指针,但变量(结构)被销毁(因为这是返回指针时的局部变量...

  • 从堆中分配板结构然后释放,最后仍然使用这个释放的指针:堆内存被其他东西损坏......

我的猜测:第二点是经常犯的错误

这是一个简单的问题:board结构存储在HEAP或STACK内存中?