Strange GDB behaviour once application is deployed to a jailbroken iPhone

2

Im trying to make an application which sends commands to GDB via NSTask and directs the output to the UITextView. It works well on the Mac (iOS Simulator). However, when deployed to the actual device (iPhone), it does not display any registers after the command "info registers" The code is as such :

 - (void)viewDidLoad
{
self.title = @"GDB";

NSLog(@"Pid for GDB execution is :%@", pid);

UIBarButtonItem *btnClicked = [[UIBarButtonItem alloc] 
                               initWithTitle:@"Commands"                                            
                               style:UIBarButtonItemStyleBordered 
                               target:self 
                               action:@selector(btnClicked:)];
self.navigationItem.rightBarButtonItem = btnClicked;
[btnClicked release];


stringInput = @"info registers";



task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/gdb"];


arguments;
arguments = [NSArray arrayWithObjects:@"abc", pid, nil];
[task setArguments: arguments];




//
dataInput = [stringInput dataUsingEncoding:NSUTF8StringEncoding];



outputPipe;
outputPipe = [NSPipe pipe];
[task setStandardOutput: outputPipe];

//
inputPipe;
inputPipe = [NSPipe pipe];
[task setStandardInput:inputPipe];


taskOutput;
taskOutput = [outputPipe fileHandleForReading];

//
taskInput;
taskInput = [inputPipe fileHandleForWriting];



[task launch];


[[[task standardInput] fileHandleForWriting] writeData:dataInput];
close([taskInput fileDescriptor]);


dataOutput;
dataOutput = [taskOutput readDataToEndOfFile];




NSString *stringOutput;
stringOutput = [[NSString alloc] initWithData: dataOutput encoding: NSUTF8StringEncoding];
NSLog (@"GDB Output:\n%@", stringOutput);

//NSLog(@"GDB Input:\n@", stringInput);





//[string release];
[task release];
[arguments release];

textView = [[UITextView alloc]initWithFrame:CGRectMake(8,17,330,440)];


textView.editable=NO;
textView.scrollEnabled=YES;
[self.view addSubview:textView];

textView.text = [textView.text stringByAppendingString:stringOutput];

    [super viewDidLoad];

}

The output on the IOS Simulator looks like this (x86 registers)

enter image description here

The output on the actual device (iPhone) looks like this :

enter image description here

The build output when run on the iPhone looks like this :

RE:Notice: Launching: com.apple.gdb
abc: No such file or directory
//420: No such file or directory
Unable to access task for process-id 420: (os/kern) failure.
The program has no registers now.
2011-08-29 09:10:05.923 TableViewController_09[421:507] GDB Output:
GNU gdb 6.3.50.20050815-cvs (Fri May 20 08:08:42 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "--host=arm-apple-darwin9 --target="...
(gdb) (gdb) 

As a side note, I have even tried to add the arguments -arch armv7*. It is still unable to attach to the specified process.

Edit : I may have found the source of my woes. This showed up in the console when I tried invoking gdb in my iPhone through the application :

Sep  8 11:13:26 unknown sandboxd[2138] <Notice>: gdb(2137) deny mach-priv-task-port

Process:         gdb [2137]
Path:            /usr/bin/gdb
Load Address:    0x1000
Identifier:      gdb
Version:         ??? (1.0)
Code Type:       ARM (Native)
Parent Process:  TableViewController_09 [2135]

Date/Time:       2011-09-08 11:13:25.948 +0800
OS Version:      iPhone OS 4.3.3 (8J2)
Report Version:  104

Backtrace:
0   libsystem_kernel.dylib          0x36223c8c task_for_pid + 8
1   gdb                             0x001e4428 macosx_child_attach + 44 (macosx-nat-inferior.c:1781)
2   gdb                             0x00082f18 attach_command + 116 (infcmd.c:3089)
3   gdb                             0x000a3788 catch_command_errors + 100 (exceptions.c:540)
4   gdb                             0x000a53e4 captured_main + 2632 (main.c:888)
5   gdb                             0x000a3838 catch_errors + 104 (exceptions.c:525)
6   gdb                             0x000a4988 gdb_main + 56 (main.c:1033)
7   gdb                             0x0000224c main + 40 (gdb.c:36)
8   gdb                             0x0000217c _start + 312
9   gdb                             0x00002018 start + 24
10  gdb                             0x001e3dac macosx_lookup_task + 1596 (macosx-nat-inferior.c:1522)

Binary Images:
    0x1000 -   0x2fbf5b +gdb arm  /usr/bin/gdb
0x36214000 - 0x3622bfff  libsystem_kernel.dylib armv7  <a06ec84e53bf32098b63c0caebdb45b6> /usr/lib/system/libsystem_kernel.dylib

If any one knows a way around this problem, please kindly share. I have been searching for a solution for weeks to no avail...

iphone
objective-c
gdb
nstask
asked on Stack Overflow Aug 29, 2011 by Jared Aaron Loo • edited Sep 8, 2011 by Jared Aaron Loo

3 Answers

1

You can't run gdb on the device itself unless you jailbreak your device.

answered on Stack Overflow Sep 8, 2011 by Yuji
1

Finally found a way around it. All I had to do was to install my app into the /Application folder on my iPhone and setuid it. This way, it would run with root privileges, and would thus be allowed to run outside Apple's sandbox limitations.

answered on Stack Overflow Sep 12, 2011 by Jared Aaron Loo
0

I found that simply moving the executable to the /Applications directory itself and then sym-linking it back to the sandbox, works as well

answered on Stack Overflow Jun 21, 2012 by Yuriy Gettya

User contributions licensed under CC BY-SA 3.0