我正在尝试创建一个使用GDB附加到程序的NSTask,但是我的程序在启动任务后就冻结了。这可能吗?这是我正在使用的代码:
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 :(得分:1)
需要考虑的一些事项:
set a pipe for standard input是明智的。在某些情况下,特别是在调用NSLog()
时,最终会挂起NSTask
。
如果将-readDataToEndOfFile
发送到标准输出句柄,则线程将暂停,直到任务完成执行。如果代码在主线程上运行,那么这一点尤其糟糕 - 没有用户界面更改或应用程序事件将被处理,这很可能最终导致应用程序失误。请改用…inBackground…
方法。
您没有向标准输入发送数据。如果gdb
没有收到任何输入,它会无限期地等待,直到收到命令为止。