如何使用Instruments并在Command Lines应用程序中显示控制台

时间:2009-11-14 17:47:37

标签: c xcode debugging macos instruments

我在OSX上使用Xcode来开发命令行C应用程序。我还想使用Instruments来分析和查找内存泄漏。

但是,在从仪器内启动应用程序时,我找不到显示控制台的方法。我也无法附加到正在运行的命令行进程(它以错误退出):

这是一个示例代码:

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <setjmp.h>

static sigjmp_buf jmpbuf;

void handler(int sig) {
    char c[BUFSIZ];

    printf ("Got signal %d\n", sig);
    printf ("Deseja sair? (s/n) ");

    fgets(c, sizeof(c), stdin);

    if(c[0] == 's') {
        exit(0);
    } else {
        siglongjmp(jmpbuf, 1);
    }
}

int main(void) {
    char buf[BUFSIZ];

    signal(SIGINT, handler);

    sigsetjmp(jmpbuf, 1);

    while(1) {
        printf(">>>");
        fgets(buf, sizeof(buf), stdin);
        printf ("Introduziu: %s\n", buf);
    }

    return(0);
}

这是我在启动Instruments后尝试连接到xcode中正在运行的进程时出现的错误:

[Switching to process 1475]
[Switching to process 1475]
Error while running hook_stop:
sharedlibrary apply-load-rules all
Error while running hook_stop:
Invalid type combination in ordering comparison.
Error while running hook_stop:
Invalid type combination in ordering comparison.
Error while running hook_stop:
Error while running hook_stop:
Error while running hook_stop:
Error while running hook_stop:
Error while running hook_stop:
Error while running hook_stop:
Error while running hook_stop:

Unable to disassemble __CFInitialize.

有什么想法吗?

4 个答案:

答案 0 :(得分:23)

这很容易。见截图。

screenshot

答案 1 :(得分:15)

为这个旧线程做贡献有点晚了,但我发现分析命令行实用程序的最佳方法是使用iprofilermanpage)。这允许从命令行收集数据,只需将其添加到命令行的开头:

iprofiler -leaks -d $HOME/tmp

(我在$HOME/tmp有一个私人临时目录,因此您可能需要使用/tmp或完全取消-d命令行选项。

如果定义了$FINDLEAKS,我的测试脚本会自动将其添加到命令行(如果在Linux下运行,则会预先添加valgrind。)

然后生成一个.dtps文件(实际上是一个目录),可以使用 Instruments 加载和分析。

如果您使用clang进行编译,则只需添加-O3-g clang 不支持-pg命令行选项)。

答案 2 :(得分:4)

请参阅this question获取答案。

来自Brad Larson:

  

从Xcode中运行您的应用程序,以便在那里输出控制台输出。在您的应用程序运行时,启动Instruments并选择合适的仪器。在菜单栏中的默认目标下,选择iPhone或计算机(适用于您正在测试的内容),然后在“附加到进程”下找到可执行文件的名称。

     

单击“记录”按钮时,应将应用程序开始在“仪器”下进行分析,同时将其控制台输出定向到Xcode。遗憾的是,此附件过程需要在应用程序启动后进行,因此您可能需要单独分析应用程序的启动。

编辑:如果这不起作用,您可能只需要重新启动计算机即可。你做过那个吗?

答案 3 :(得分:2)

您可以在选择目标时更改“选项”下拉列表中的输出。输出将显示在系统控制台(Applications / Utilities / Console)中。

IO options