2

我试图制作一个通过 NSTask 向 GDB 发送命令并将输出定向到 UITextView 的应用程序。它在 Mac(iOS 模拟器)上运行良好。但是,当部署到实际设备(iPhone)时,它在命令“info registers”之后不显示任何寄存器代码如下:

 - (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];

}

IOS 模拟器上的输出如下所示(x86 寄存器)

在此处输入图像描述

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

在此处输入图像描述

在 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

如果有人知道解决此问题的方法,请分享。我一直在寻找解决方案数周无济于事...

4

3 回答 3

1

除非您越狱设备,否则您无法gdb在设备本身上运行。

于 2011-09-08T03:16:37.973 回答
1

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

于 2011-09-12T07:21:23.753 回答
0

我发现只需将可执行文件移动到 /Applications 目录本身,然后将其符号链接回沙箱,也可以

于 2012-06-21T17:50:36.847 回答