2

NSTask を介して GDB にコマンドを送信し、出力を UITextView に送信するアプリケーションを作成しようとしています。Mac (iOS シミュレーター) で問題なく動作します。ただし、実際のデバイス (iPhone) に展開すると、コマンド「info register」の後にレジスタが表示されません。コードは次のとおりです。

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

ついにそれを回避する方法を見つけました。私がしなければならなかったのは、iPhoneの/Applicationフォルダーにアプリをインストールしてsetuidすることだけでした。このように、root権限で実行されるため、Appleのサンドボックスの制限外で実行できます。

于 2011-09-12T07:21:23.753 に答える
1

gdbデバイスをジェイルブレイクしない限り、デバイス自体で実行することはできません。

于 2011-09-08T03:16:37.973 に答える
0

実行可能ファイルを /Applications ディレクトリ自体に移動し、シンボリック リンクをサンドボックスに戻すだけでも機能することがわかりました。

于 2012-06-21T17:50:36.847 に答える