I was finally able to compile libssh2, but now I keep seeing the EXC_BAD_ACCESS
error.
This is the basic background as to how libssh2 works (at least the GUI) is this...
Now, simple commands like echo Hello World
work fine, but the whole idea of this as a project was to be able to restart my mac remotely. Originally, using the command shutdown -r
caused nothing to happen on the remote machine, and crashed the app. I then had the idea that I could simple open an applescript app that restarts the mac, by using the open /path/to/restart.app
command, which works fine. The machine restarts, yippee!
EXCEPT, the app crashes with the following error:
Thread 1: EXC_BAD_ACCESS (code=1, address=_____)
I'm really new to objective-c, and I have no idea how to go about fixing this. Looking it up on google, I've found that it's caused by:
So, I'm guessing that once the command is sent via SSH, it disconnects and then tires to show the result but the object's already gone.
I'd post the source code for this, but it's a lot of different files, so I'll post the github link:
https://github.com/x2on/libssh2-for-iOS
I have not modified any of the code, so if anyone has the desire to replicate my problem, the code I'm using is the same as the one from there.
Crash log:
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
I have downloaded the example code from https://github.com/x2on/libssh2-for-iOS, compiled libssl & libssh2 and the app. And when I ran that app, I got a very similar error as you:
Thread 1: EXC_BAD_ACCESS (code=2, address=0x12c)
This happens to me when for some reason the connection is not established. E.g. if you don't enter any IP address, this exception will happen, or if you enter something that is not an IP address.
The problem seem to be inside the x2on's app, not in libssh2 or libssl. When I debugged the app, I found out, that when the connection cannot be established, the variable called session
is NULL. Therefore the later call to libssh2_channel_open_session
will fail with this exception, because it expects its parameter not to be NULL.
See the following screenshot:
In the bottom left corner, you see the value of the session
variable. If it's NULL, then this is the problem. Also you can see the cause of the problem in the console output window in the right bottom corner, in my case it is "failed to connect!".
Anyway, the x2on's code seem to be a very very bad example of code, it ignores errors, uses bad coding style and many improper techniques (global variables, not setting rootviewcontroller) and other bad things.
x2on code has many errors; one for all let's check the executeCommand routine:
it completely ignores data lenght of buffer returned from server: the text returned has no trailing zero, so if you do more than one call to this routine you'll get trailing garbage. Solution: use rc1 value to get its length (see below).
it loops until all data is received, but it does not cumulate that data in the result string, so you'll get only the latest text received, not the full server answer. Solution: use a NSMutableString instead of NSString and append results to it:
NSMutableString *result = [[NSMutableString alloc] initWithString: @""];
...
if( rc1 > 0 ) {
[result appendString: [[NSString alloc] initWithCString:buffer length: rc1]];
bytecount += rc1;
}
*result is not handled correctly; if you do multiple call to the routine, from the second call you'll get an exception. Fast workaround:
if (result) return result;
else return @"Error - command failed";
User contributions licensed under CC BY-SA 3.0