Cocoa 为gdb创建NSTask

Cocoa 为gdb创建NSTask,cocoa,nstask,Cocoa,Nstask,我正在尝试创建一个使用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

我正在尝试创建一个使用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”在正确的位置,因为我没有收到“没有这样的文件或目录”错误。控制台只显示“启动”,旋转的沙滩球只持续一分钟,直到我结束跑步。有什么办法可以让这一切顺利吗

需要考虑的一些事情:

  • 这样做是明智的。在某些情况下,特别是调用
    NSLog()
    时,会挂起
    NSTask

  • 如果将
    -readdatatoendofile
    发送到标准输出句柄,线程将暂停,直到任务完成执行。如果代码在主线程上运行,这尤其糟糕——不会处理任何用户界面更改或应用程序事件,这很可能导致应用程序搁浅。请改用
    …inBackground…
    方法

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


    • 需要考虑的一些事情:

      • 这样做是明智的。在某些情况下,特别是调用
        NSLog()
        时,会挂起
        NSTask

      • 如果将
        -readdatatoendofile
        发送到标准输出句柄,线程将暂停,直到任务完成执行。如果代码在主线程上运行,这尤其糟糕——不会处理任何用户界面更改或应用程序事件,这很可能导致应用程序搁浅。请改用
        …inBackground…
        方法

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


      我建议您阅读Cocoa Dev Central上的以下文章:和。您的gdb NSTask是在执行命令后立即分离还是创建持久会话(如在终端中)?我建议您阅读Cocoa Dev Central上的以下文章:和。您的gdb NSTask是在执行命令后立即分离还是创建持久会话(如在终端中)?