在Swift崩溃的情况下转储堆栈和异常

时间:2015-07-09 21:16:55

标签: objective-c swift

我是Swift的新手。

当我在Objective-C上有一个非常难以破解的错误时,我通常用以下内容替换我的main.m文件:

int main(int argc, char *argv[]) {
  int retVal;
  @autoreleasepool {
    @try {
      retVal = UIApplicationMain(argc, argv, nil, nil); //***
    }
    @catch (NSException *exception) {
      NSLog(@"\n\nSTACK SYMBOLS\n%@",[exception callStackSymbols]);
      NSLog(@"\n\nSTACK RETURN ADDRESSES\n%@",
                  [exception callStackReturnAddresses]);
      NSLog(@"\n\nOBJECT: %@",[exception name]);
      NSLog(@"\n\nUSER INFO DICT: %@",[exception userInfo]);
      NSLog(@"\n\nREASON: %@",[exception reason]);
      retVal = 1;
    }
  }
  return retVal;
}

这将有助于收集有关崩溃的信息。

当应用程序崩溃时,代码将转储堆栈,返回地址和大量有助于识别有问题的行的信息。

是否可以为Swift做类似的事情?

1 个答案:

答案 0 :(得分:1)

在纯Swift中没有真正的等效模式,因为在Swift中没有等同于@try。 (Swift2的try在使用和实现方面是无关的,根本不同。)

也就是说,有一种方法可以覆盖程序启动。来自Programming Guide

  

UIApplicationMain

     

将此属性应用于类以指示它是应用程序委托。使用此属性等效于调用UIApplicationMain函数并将此类的名称作为委托类的名称传递。

     

如果不使用此属性,请提供带有调用UIApplicationMain(_:_:_:)函数的main函数的main.swift文件。例如,如果您的应用使用UIApplication的自定义子类作为其主要类,请调用UIApplicationMain(_:_:_:)函数而不是使用此属性。

因此,您可以从应用程序委托中删除UIApplicationMain,并按照描述创建swift.main文件。但你不能在那里捕捉例外。

但是你当然可以在ObjC中使用上面的main.m,它的工作方式也是一样的。只需删除UIApplicationMain属性。

(你在这里做的大部分内容与你通常从崩溃堆栈中获得的内容非常相似。这真的能为你提供更好的标准崩溃报告信息吗?)