【问题标题】:Xcode 4: Exceptions not being logged to the consoleXcode 4:未将异常记录到控制台
【发布时间】:2011-10-15 04:41:42
【问题描述】:

我最近升级到 Xcode 4,但还没有弄清楚如何将异常和错误消息记录到运行控制台。

示例:在 Xcode 3 中,[[NSArray array] objectAtIndex:1] 导致以下内容被记录到控制台。

2011-08-10 10:27:22.061 App[28662:40b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSArray objectAtIndex:]: index 1 beyond bounds for empty array'
    *** Call stack at first throw:
(
    0   CoreFoundation                      0x015babe9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x0170f5c2 objc_exception_throw + 47
    2   CoreFoundation                      0x015b080c -[__NSArrayI objectAtIndex:] + 236
    3   App                                 0x00002514 -[AppDelegate application:didFinishLaunchingWithOptions:] + 357
    4   UIKit                               0x003fc1fa -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163
    5   UIKit                               0x003fe55e -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 439
    6   UIKit                               0x00408db2 -[UIApplication handleEvent:withNewEvent:] + 1533
    7   UIKit                               0x00401202 -[UIApplication sendEvent:] + 71
    8   UIKit                               0x00406732 _UIApplicationHandleEvent + 7576
    9   GraphicsServices                    0x01c24a36 PurpleEventCallback + 1550
    10  CoreFoundation                      0x0159c064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    11  CoreFoundation                      0x014fc6f7 __CFRunLoopDoSource1 + 215
    12  CoreFoundation                      0x014f9983 __CFRunLoopRun + 979
    13  CoreFoundation                      0x014f9240 CFRunLoopRunSpecific + 208
    14  CoreFoundation                      0x014f9161 CFRunLoopRunInMode + 97
    15  UIKit                               0x003fdfa8 -[UIApplication _run] + 636
    16  UIKit                               0x0040a42e UIApplicationMain + 1160
    17  App                                 0x00002393 main + 85

此异常不会在 Xcode 4 中将任何内容记录到控制台。

我可以通过添加异常断点来查看调用堆栈 - 但是,继续通过异常断点不会将任何内容记录到控制台(甚至没有模糊的 SIGABRTEXC_BAD_ACCESS 消息)。

我在 Edit Scheme 窗口的 Diagnostics 选项卡中检查了“Log Exceptions”和“Enable Zombie Objects”,但没有帮助。还有其他我可能会丢失的设置吗?

非常感谢。

【问题讨论】:

  • 也许这里的东西会有所帮助。抱歉,我没有更具体的内容可提供。 developer.apple.com/library/mac/#documentation/IDEs/Conceptual/…
  • 奇怪的是我在 MAC Lion 中使用 xcode 4,它只是以与 xcode3 相同的方式跟踪异常!你有哪个 Xcode4?!以及哪个操作系统?!
  • Xcode 4.2 在雪豹上运行。我确定我只是配置错误。

标签: ios xcode xcode4


【解决方案1】:

我在 main.m 中捕获了异常 这是我在最近的应用程序中编写的代码。我还在 Edit Scheme 中启用了 Zombie 对象,我还发现向我的应用程序添加异常断点很有帮助。

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

int main(int argc, char *argv[])
{
    int retVal;
    @autoreleasepool {
        @try 
        {
            retVal = UIApplicationMain(argc, argv, nil,        NSStringFromClass([AppDelegate class]));
           }
        @catch (NSException *exception) 
       {
           NSLog(@"CRASH===> %@", [exception callStackSymbols]);
            @throw;
        }  
       @finally 
       {

       }
       return retVal;
    }
}

【讨论】:

    【解决方案2】:

    您可以通过在您的 App Delegate 中建立一个未捕获的异常处理程序来实现这一点。

    void uncaughtExceptionHandler(NSException *exception)
    {
       if ( exception )
       {
          NSLog(@"Exception %@", exception);
          NSLog(@"Exception Call Stack %@", [exception callStackSymbols]);
       }
    
    }
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
       ...
    
       NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
    

    【讨论】:

      【解决方案3】:

      我在 XCode 4.6 中完全尝试了您的示例,并得到以下日志:
      *** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayI objectAtIndex:]:空数组的索引 1 超出范围”
      *** 首先抛出调用堆栈:
      (0x1cd0012 0x110de7e 0x1c85b44 0x4547 0x1121705 0x552c0 0x291a64 0x1121705 0x552c0 0x55258 0x116021 0x11657f 0x1156e8 0x84cef 0x84f02 0x62d4a 0x54698 0x1c2bdf9 0x1c2bad0 0x1c45bf5 0x1c45962 0x1c76bb6 0x1c75f44 0x1c75e1b 0x1c2a7e3 0x1c2a668 0x51ffc 0x285d 0x2785为0x1) libc++abi.dylib:终止调用抛出异常

      【讨论】:

      • 嗯,这不是问题,但声明上面问题中提到的问题在 Xcode 4.6 中不会发生。我认为这可能有助于解决问题...
      • 啊,我明白了,或者至少我认为是这样的 :-) 有点意思:问题似乎在 xyz 中解决了,这是我得到的日志如果是这样,您可以考虑稍微澄清一下(包括格式化为日志/跟踪)
      • 对不起,如果这不够清楚。问题的标题是“未将异常记录到控制台”,并给出了一个不记录任何内容的示例。我只是在 Xcode 4.6 中尝试了这个示例,然后它记录到了控制台。这是我的声明,我展示了日志。我不知道我该怎么说更清楚。
      • @kleopatra:为什么你删除了明显基于误解的第一条评论,却让你对我的回答投了反对票?
      • 你没有编辑你的答案——所以我不能(除非我会做我不喜欢做的事情..你的答案,你的工作是让它至少可读;- )
      【解决方案4】:

      在所有以下情况中,shareKit 都有内存泄漏!

      我所有的代码都没有泄漏的迹象,但都在 shareKit 中!

      Leaked Object # Address Size 责任库责任框架 NSMallocBlock,1 0xf641c50 32 字节 Twitter -[TWInFlightSessionCallInfo setRemoteCall:] TWInFlightSessionCallInfo,1 0xf676380 16 字节 Twitter -[TWSession emptyCallInfo] Malloc 16 字节,1 0xf6457c0 16 字节 Twitter -[TWSession recordAndIssueCallInfo:] malloc 128 字节,2 256 字节 libdispatch.dylib dispatch_queue_create$VARIANT$up NSLock,1 0xf64b450 64 字节 Twitter -[TWSession init] TWSession,1 0xf62c3e0 32 字节 Twitter -[TWTweetComposeViewController 会话] NSMutableArray,1 0x2c8540 32 字节 Twitter -[TWSession init] NSMallocBlock,1 0x1084ebb0 32 字节 Twitter -[TWInFlightSessionCallInfo setRemoteCall:]

      【讨论】:

        【解决方案5】:

        请考虑使用以下内容增强您的 gdbinit 文件:

        How do I set these break points in ~/.gdbinit?

        fb -[NSException raise]
        fb -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:]
        fb -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:]
        
        #define NSZombies
        # this will give you help messages.  Set to NO to turn them off.
        set env MallocHelp=YES
        # might also be set in launch arguments.
        set env NSZombieEnabled=YES
        set env NSDeallocateZombies=NO
        set env MallocCheckHeapEach=100000
        set env MallocCheckHeapStart=100000
        set env MallocScribble=YES
        set env MallocGuardEdges=YES
        set env MallocCheckHeapAbort=1
        
        set env CFZombie 5
        
        fb -[_NSZombie init]
        fb -[_NSZombie retainCount]
        fb -[_NSZombie retain]
        fb -[_NSZombie release]
        fb -[_NSZombie autorelease]
        fb -[_NSZombie methodSignatureForSelector:]
        fb -[_NSZombie respondsToSelector:]
        fb -[_NSZombie forwardInvocation:]
        fb -[_NSZombie class]
        fb -[_NSZombie dealloc]
        
        fb szone_error
        

        正如 Kendal 在此原始帖子中的评论中所述:如果您还没有 gdbinit 文件,您需要创建一个名为 .gdbinit 的新文件 - 将其放在您的主目录中并用提供的内容填充它。现在每次 gdb 启动它都会执行这个文件中的命令。

        希望这会有所帮助。

        【讨论】:

        • 感谢您的回答,但不幸的是,这并没有帮助。我不想设置断点,我只是希望将异常记录到控制台。请参阅我在上面的原始问题中添加的示例。
        猜你喜欢
        • 1970-01-01
        • 2021-02-11
        • 2019-04-19
        • 2012-03-07
        • 2017-01-26
        • 1970-01-01
        • 2015-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多