将应用程序部署到越狱iPhone后,奇怪的GDB行为

问题描述:

我试图让一个应用程序通过NSTask向GDB发送命令,并将输出指向UITextView。它适用于Mac(iOS模拟器)。然而,当部署到实际设备(iPhone),它并没有在命令之后显示任何寄存器“信息寄存器”的代码是这样:将应用程序部署到越狱iPhone后,奇怪的GDB行为

- (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:\[email protected]", 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]; 

} 

在IOS模拟器输出如下所示(X86寄存器)

enter image description here

实际设备(iPhone)上的输出如下所示:

enter image description here

当运行在iPhone上生成的输出是这样的:

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) 

作为一个方面说明,我甚至尝试添加的参数-arch的ARMv7 *。它仍然无法附加到指定的过程。

编辑:我可能已经找到了我的困境的来源。这在控制台中出现了,当我试图在我的iPhone通过应用程序调用GDB:

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 

如果有任何人知道解决这个问题的方法,请您分享。我一直在寻找一个解决方案,几个星期没有用...

终于找到了解决办法。我所要做的就是将我的应用程序安装到我的iPhone上的/ Application文件夹中并设置它。这样,它将以root权限运行,并因此被允许在Apple的沙箱限制之外运行。

+0

Jared,你能否详细说明如何在沙箱外安装应用程序? –

+0

只需像往常一样部署应用程序,然后将.app文件夹从/ var/mobile/Applications/ /传输到/ Applications文件夹。 Respring您的设备,它应该在root用户下运行。 –

你不能在设备上运行gdb,除非你越狱你的设备。

+0

这已经是越狱和gdb已经安装。我怀疑sandboxd是否负责拒绝对某些功能的访问 –

+0

特别是,mach-priv-task-port –

+0

如果它已经越狱,你不能完全禁用sandboxd吗? – Yuji

我发现,简单的移动可执行文件到/ Applications目录本身,然后符号联回沙箱,工程,以及