我在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.
有什么想法吗?
答案 0 :(得分:23)
这很容易。见截图。
答案 1 :(得分:15)
为这个旧线程做贡献有点晚了,但我发现分析命令行实用程序的最佳方法是使用iprofiler
(manpage)。这允许从命令行收集数据,只需将其添加到命令行的开头:
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)中。