Как использовать инструменты и отображать консоль в приложениях командной строки - PullRequest
20 голосов
/ 14 ноября 2009

Я использую Xcode на OSX для разработки приложений командной строки 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 ]

24 голосов
/ 05 октября 2014

Это легко. Смотрите скриншот.

screenshot

15 голосов
/ 11 мая 2013

Уже немного поздно внести свой вклад в этот старый поток, однако я обнаружил, что лучший способ профилирования утилиты командной строки - это использовать iprofiler ( manpage ). Это позволяет собирать данные из командной строки, просто добавив их в начало командной строки:

iprofiler -leaks -d $HOME/tmp

(у меня есть личный временный каталог на $HOME/tmp, поэтому вам может понадобиться использовать /tmp или вообще не указывать параметр командной строки -d).

Мои тестовые сценарии автоматически добавляют это в командную строку, если определено $FINDLEAKS (и будут добавлены valgrind при работе в Linux).

Затем генерируется файл .dtps (фактически каталог), который можно загрузить и проанализировать с помощью Instruments .

Если вы компилируете с использованием clang, просто добавьте -O3 и -g ( clang не поддерживает параметр командной строки -pg).

4 голосов
/ 14 ноября 2009

См. этот вопрос для вашего ответа.

От Брэда Ларсона:

Запустите ваше приложение из Xcode, чтобы получить консольный вывод. Пока ваше приложение работает, запустите Инструменты и выберите подходящий инструмент. В разделе «Цель по умолчанию» в строке меню выберите «iPhone» или «Компьютер» (в зависимости от того, что вы тестируете), а в разделе «Присоединить к процессу» найдите имя вашего исполняемого файла.

Когда вы нажимаете кнопку записи, ваше приложение должно начать профилироваться в разделе «Инструменты», а его консольный вывод будет направлен в XCode. К сожалению, этот процесс прикрепления должен начаться после запуска приложения, поэтому вам, возможно, придется профилировать запуск приложения отдельно.

Редактировать: Если это не сработало, возможно, вам просто нужно перезагрузить компьютер. Вы уже сделали это?

2 голосов
/ 13 мая 2012

Вы можете изменить вывод в раскрывающемся списке Параметры при выборе цели. Вывод появится в системной консоли (Приложения / Утилиты / Консоль).

IO options

...