对GDB

2011-04-30 39 views
1

我试图创建一个使用GDB附加到一个程序中的NSTask创建NSTask,但我的程序启动后的任务只是冻结。这可能吗?下面是我使用的代码:对GDB

NSTask *task = [NSTask new]; 
[task setLaunchPath:@"/usr/bin/gdb"]; 
NSArray *args = [NSArray arrayWithObjects:@"TestApp.app", nil]; 
[task setArguments:args]; 
[task launch]; 
NSLog(@"Launched."); 

NSData *data = [[outPipe fileHandleForReading] readDataToEndOfFile]; 
NSLog(@"Read data."); 

我敢肯定“TestApp.app”是在正确的位置,因为我不明白“没有这样的文件或目录”错误。控制台只打印“已启动”。而旋转的沙滩球只会持续一分多钟,直到我杀死跑步。任何想法可以使这项工作?

+0

什么时候TestApp退出? – justin 2011-04-30 02:01:00

+0

我建议你阅读可可开发中心以下信息:[包装UNIX命令(http://cocoadevcentral.com/articles/000025.php)和[包装UNIX命令第二部分(http://cocoadevcentral.com/文章/ 000031.php)。 – 2011-04-30 02:58:32

+0

执行该命令后,您的gdb NSTask会立即脱离还是创建一个持久性会话(如在终端中)? – 2011-11-02 07:20:59

回答

1

有些事情要考虑:

  • 这是明智的set a pipe for standard input。有一些情况,特别是当调用NSLog()时,最终挂起NSTask

  • 如果发送-readDataToEndOfFile到标准输出手柄,你的线程将暂停,直到任务完成执行。如果代码在主线程上运行,那么这是特别糟糕的 - 不会更改用户界面更改或应用程序事件,这很可能最终导致应用程序退出。改为使用…inBackground…方法。

  • 你不将数据发送到标准输入。如果gdb没有收到任何输入,它将无限期地等待,直到收到命令。