来自NSLog的Segfault?

时间:2016-01-21 03:40:05

标签: ios objective-c iphone crash segmentation-fault

我看到使用NSLog的段错误,具体来说,它位于64位设备上,SEGV_ACCERR。我是iOS的新手,所以我有点困惑。

这是堆栈跟踪:

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x108074000
Crashed Thread:  0

Thread 0 Crashed:
0   libsystem_platform.dylib             0x00000001826ea31c _platform_memmove + 300
1   libsystem_asl.dylib                  0x00000001825289a4 asl_string_append_no_encoding_len + 92
2   libsystem_asl.dylib                  0x0000000182522fc8 asl_string_new + 108
3   libsystem_asl.dylib                  0x0000000182522df4 asl_msg_to_string_raw + 68
4   libsystem_asl.dylib                  0x00000001825228dc _asl_send_message + 828
5   libsystem_asl.dylib                  0x00000001825224fc asl_send + 8
6   CoreFoundation                       0x0000000182a6fa1c __CFLogCString + 568
7   CoreFoundation                       0x0000000182a6f7ac _CFLogvEx2 + 300
8   CoreFoundation                       0x0000000182a6fc14 _CFLogvEx3 + 152
9   Foundation                           0x0000000183435dd8 _NSLogv + 128
10  Foundation                           0x000000018336ae04 NSLog + 28

以下是调用此代码的代码:

    NSString *truncated = [NSString stringWithUTF8String:buffer];
    // Using original NSLog to print.
    #undef NSLog
            NSLog(@"%@", truncated);

它从我的NSLog电话中崩溃了。

其中buffer只是一个char缓冲区。

我的具体问题是:

  1. 是否可能因使用Apple提供的NSLog而崩溃?或者我的堆栈跟踪错误了吗?
  2. SEG_ACCERR在这种情况下甚至意味着什么?
  3. 我怎样才能找到这是否是由内存不良问题引起的?
  4. 多线程下的asl文件是什么东西爆炸?
  5. 我该如何调试呢?
  6. 任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

你说缓冲区是一个char缓冲区。如果是这种情况,您应该像这样初始化字符串

  

NSString * truncated = [[NSString alloc] initWithBytes:buffer   length:len NSUTF8StringEncoding];

其中len是缓冲区中字符的长度。