用libssh2 EXC_BAD_ACCESS?

时间:2012-04-19 13:25:50

标签: objective-c ios

我终于能够编译libssh2,但现在我一直看到EXC_BAD_ACCESS错误。

这是关于libssh2如何工作(至少是GUI)的基本背景......

  1. 输入命令
  2. 输入主机IP
  3. 输入用户名/通行证
  4. 按按钮发送SSH命令
  5. 现在,像echo Hello World这样的简单命令运行正常,但作为一个项目的整体想法是能够远程重启我的mac。最初,使用命令shutdown -r在远程计算机上没有发生任何事情,并使应用程序崩溃。然后我想到了我可以通过使用open /path/to/restart.app命令简单地打开一个重启mac的AppleScript应用程序,这可以正常工作。机器重启,yippee!

    除此之外,该应用程序崩溃并出现以下错误:

    Thread 1: EXC_BAD_ACCESS (code=1, address=_____)
    

    我是Objective-c的新手,我不知道如何解决这个问题。在谷歌上查找,我发现它是由以下原因引起的:

    1. 内存问题
    2. 消息被发送到已经发布的对象(我不确定这意味着什么,有什么帮助?)
    3. 所以,我猜测一旦命令通过SSH发送,它会断开然后轮胎显示结果,但对象已经消失了。

      我发布了这个的源代码,但它有很多不同的文件,所以我将发布github链接:

      https://github.com/x2on/libssh2-for-iOS

      我没有修改任何代码,所以如果有人想要复制我的问题,我使用的代码与那里的代码相同。

      崩溃日志:

      Process:         libssh2-for-iOS [38153]
      Path:            /Users/USER/Library/Application Support/iPhone Simulator/*/libssh2-for-iOS.app/libssh2-for-iOS
      Identifier:      libssh2-for-iOS
      Version:         ???
      Code Type:       X86 (Native)
      Parent Process:  ??? [1]
      User ID:         501
      
      Date/Time:       2012-04-18 18:32:03.883 -0400
      OS Version:      Mac OS X 10.8 (12A154q)
      Report Version:  10
      
      Crashed Thread:  0
      
      Exception Type:  EXC_BAD_ACCESS (SIGBUS)
      Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000000
      
      External Modification Warnings:
      Debugger attached to process.
      
      VM Regions Near 0:
      --> __PAGEZERO             0000000000000000-0000000000001000 [    4K] ---/--- SM=NUL  /Users/USER/Library/Application Support/iPhone Simulator/*/libssh2-for-iOS.app/libssh2-for-iOS
          __TEXT                 0000000000001000-0000000000002000 [    4K] r-x/rwx SM=COW  /Users/USER/Library/Application Support/iPhone Simulator/*/libssh2-for-iOS.app/libssh2-for-iOS
      
      Application Specific Information:
      iPhone Simulator 272, iPhone OS 5.0 (iPhone/9A334)
      
      
      Thread 0 Crashed:
      0   ???                             0000000000 0 + 0
      1   libssh2-for-iOS                 0x00003f39 _libssh2_channel_open + 281
      2   libssh2-for-iOS                 0x00004837 libssh2_channel_open_ex + 151
      3   libssh2-for-iOS                 0x00003714 -[SSHWrapper executeCommand:] + 212
      4   libssh2-for-iOS                 0x00002b22 -[libssh2_for_iOSAppDelegate executeCommand:] + 338
      5   CoreFoundation                  0x01603ec9 -[NSObject performSelector:withObject:withObject:] + 73
      6   UIKit                           0x0049e5c2 -[UIApplication sendAction:to:from:forEvent:] + 96
      7   UIKit                           0x0049e55a -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
      8   UIKit                           0x00543b76 -[UIControl sendAction:to:forEvent:] + 66
      9   UIKit                           0x0054403f -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 503
      10  UIKit                           0x00542e22 -[UIControl touchesBegan:withEvent:] + 264
      11  UIKit                           0x004c393f -[UIWindow _sendTouchesForEvent:] + 272
      12  UIKit                           0x004c3c56 -[UIWindow sendEvent:] + 273
      13  UIKit                           0x004aa384 -[UIApplication sendEvent:] + 464
      14  UIKit                           0x0049daa9 _UIApplicationHandleEvent + 8196
      15  GraphicsServices                0x01cf8fa9 PurpleEventCallback + 1274
      16  CoreFoundation                  0x015d61c5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
      17  CoreFoundation                  0x0153b022 __CFRunLoopDoSource1 + 146
      18  CoreFoundation                  0x0153990a __CFRunLoopRun + 2218
      19  CoreFoundation                  0x01538db4 CFRunLoopRunSpecific + 212
      20  CoreFoundation                  0x01538ccb CFRunLoopRunInMode + 123
      21  GraphicsServices                0x01cf7879 GSEventRunModal + 207
      22  GraphicsServices                0x01cf793e GSEventRun + 114
      23  UIKit                           0x0049ba9b UIApplicationMain + 1175
      24  libssh2-for-iOS                 0x00003266 main + 134
      25  libssh2-for-iOS                 0x00002955 start + 53
      
      Thread 1:
      0   libsystem_kernel.dylib          0x921059be kevent + 10
      1   libdispatch.dylib               0x01c9e398 _dispatch_mgr_invoke + 918
      2   libdispatch.dylib               0x01c9cc9d _dispatch_mgr_thread + 53
      
      Thread 2:: WebThread
      0   libsystem_kernel.dylib          0x921027e2 mach_msg_trap + 10
      1   libsystem_kernel.dylib          0x92101cc0 mach_msg + 68
      2   CoreFoundation                  0x015d613a __CFRunLoopServiceMachPort + 186
      3   CoreFoundation                  0x01539605 __CFRunLoopRun + 1445
      4   CoreFoundation                  0x01538db4 CFRunLoopRunSpecific + 212
      5   CoreFoundation                  0x01538ccb CFRunLoopRunInMode + 123
      6   WebCore                         0x03583220 RunWebThread(void*) + 560
      7   libsystem_c.dylib               0x9445dd03 _pthread_start + 344
      8   libsystem_c.dylib               0x944486ae thread_start + 34
      
      Thread 0 crashed with X86 Thread State (32-bit):
        eax: 0x00000000  ebx: 0x00000007  ecx: 0x07439400  edx: 0x00000000
        edi: 0x00040000  esi: 0x00008000  ebp: 0xbfffbbc8  esp: 0xbfffbb2c
         ss: 0x00000023  efl: 0x00010286  eip: 0x00000000   cs: 0x0000001b
         ds: 0x00000023   es: 0x00000023   fs: 0x00000000   gs: 0x0000000f
        cr2: 0x00000000
      Logical CPU: 1
      
      (Binary images removed, too many characters)
      
      External Modification Summary:
        Calls made by other processes targeting this process:
          task_for_pid: 1
          thread_create: 0
          thread_set_state: 32
        Calls made by this process:
          task_for_pid: 0
          thread_create: 0
          thread_set_state: 0
        Calls made by all processes on this machine:
          task_for_pid: 14309
          thread_create: 0
          thread_set_state: 550
      
      VM Region Summary:
      ReadOnly portion of Libraries: Total=155.0M resident=50.0M(32%) swapped_out_or_unallocated=105.0M(68%)
      Writable regions: Total=36.7M written=2264K(6%) resident=9020K(24%) swapped_out=108K(0%) unallocated=27.9M(76%)
      
      REGION TYPE                      VIRTUAL
      ===========                      =======
      CG image                             16K
      CoreAnimation                       532K
      MALLOC                             21.8M
      MALLOC guard page                    32K
      Memory tag=35                      10.8M
      SQLite page cache                   288K
      Stack                              65.3M
      VM_ALLOCATE                         136K
      __DATA                             9660K
      __LINKEDIT                         55.9M
      __PAGEZERO                            4K
      __TEXT                             99.1M
      __UNICODE                           544K
      mapped file                       237.8M
      shared memory                        12K
      ===========                      =======
      TOTAL                             501.6M
      

2 个答案:

答案 0 :(得分:2)

我已经从https://github.com/x2on/libssh2-for-iOS下载了示例代码,编译了libssl& libssh2和应用程序。当我运行该应用程序时,我得到了一个非常类似的错误:

Thread 1: EXC_BAD_ACCESS (code=2, address=0x12c)

由于某些原因未建立连接,这种情况发生在我身上。例如。如果您没有输入任何IP地址,则会发生此异常,或者如果您输入的内容不是IP地址。

问题似乎在x2on的应用程序内部,而不是在libssh2或libssl中。当我调试应用程序时,我发现,当无法建立连接时,名为session的变量为NULL。因此,稍后对libssh2_channel_open_session的调用将因此异常而失败,因为它期望其参数不为NULL。

请参阅以下屏幕截图:

Debugging the exception

在左下角,您可以看到session变量的值。如果它是NULL,那么这就是问题所在。您也可以在右下角的控制台输出窗口中查看问题的原因,在我的情况下,它是“连接失败!”。

无论如何,x2on的代码似乎是一个非常糟糕的代码示例,它忽略了错误,使用了错误的编码风格和许多不正确的技术(全局变量,没有设置rootviewcontroller)和其他不好的东西。

答案 1 :(得分:1)

x2on代码有很多错误;一个人让我们检查一下executeCommand例程:

  • 它完全忽略了从服务器返回的缓冲区的数据长度:返回的文本没有尾随零,所以如果你对这个例程进行多次调用,你将得到尾随垃圾。解决方案:使用rc1值来获取其长度(见下文)。

  • 循环直到收到所有数据,但它不会累积结果字符串中的数据,因此您只会收到最新的文本,而不是完整的服务器答案。解决方案:使用NSMutableString而不是NSString并将结果附加到它:

    NSMutableString *result = [[NSMutableString alloc] initWithString: @""];
    ...
    if( rc1 > 0 ) {
        [result appendString: [[NSString alloc] initWithCString:buffer length: rc1]];
            bytecount += rc1;
        }
    
  • *结果处理不正确;如果您对例程进行多次调用,则从第二次调用中您将获得异常。快速解决方法:

    if (result) return result;
    else return @"Error - command failed";