函数调用后XCode 3.2.6堆栈​​损坏

时间:2011-08-05 15:02:03

标签: objective-c ios xcode

我对一个非常简单的“演示”应用程序有一个非常奇怪的问题。 基本上问题是,如果我使用单个参数进行类方法调用,并且此方法立即返回但在返回后定义了变量(见下文),那么调用堆栈会被损坏而其他一些变量也会被更改...我知道这听起来很疯狂,但这里是代码......

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    // Override point for customization after application launch.

    [self.window makeKeyAndVisible];

    NSError *er=[MLRESTRequest test:nil];  //<- this line modifies the "application" variable passed as first argument!

    return YES;
}


@implementation MLRESTRequest
+ (NSError*) test:(id)task
{
    return nil;

    NSURLResponse *responseHeaders=nil;
    NSDictionary *responseHeadersDict=nil;
    NSError *error=nil;
    NSData *result=nil;
    NSURL *urlToCall = nil;
    NSMutableURLRequest *urlRequest=nil;    
    NSString *serverRequest=nil;
    NSString *cookie=nil;

    NSString *server=nil;
    NSString *port=nil;
    NSString *call=nil;
    //return nil;
}
@end

如果我在“测试”方法结束时移动返回,则一切正常......

编辑:我在评论中发布了问题的图片

Edit2:我重新映像了mac并安装了xCode 3.2.6的新副本 - 问题消失了。可悲的是,几天后我开始遇到类似的问题......(从函数调用返回后,堆栈变量没有任何理由变化)...我在3.2.5和4.0上重新编译完全相同的代码,问题再次消失了......我不知道该怎么做,但现在将远离3.2.6

编辑3:如果有人仍然对这种情况感兴趣 - 我已经证明3.2.6中使用的GCC 4.2是错误的 - 如果使用LLVM + GCC 4.2则没有崩溃

3 个答案:

答案 0 :(得分:2)

您是否在发布模式下进行调试?还是调试模式?如果您处于发布模式,那么您无法真正信任调试器告诉您的任何事情。

答案 1 :(得分:1)

如果您在编译时启用了优化,那么将在该代码中修改application的唯一方法就是发布。故事结束。

test:的实现,无论return语句在哪里,几乎都没有,它肯定不会影响父堆栈框架。

正如约书亚所说,你没有提供足够的信息来告诉你发生了什么。发布崩溃的回溯,对于初学者来说。

答案 2 :(得分:0)

根据您对Joshua Weinberg的评论,听起来您正在尝试访问已经优化的变量,即在下面返回的变量。不要那样做!