Xcode и Curses.h с ошибкой открытия терминала - PullRequest
7 голосов
/ 07 февраля 2011

Я пытаюсь скомпилировать простой проклятый проект с Xcode.Программа прекрасно компилируется с g ++ в терминале с флагом -lcurses и работает нормально.

Начинается с создания инструмента командной строки с типом c ++.импортировал curses.h в мой основной.В целевой программе «Информация» -> «Основные» -> «Связанные библиотеки» был добавлен libCurses.dylib.

Прекрасно компилируется, но окно терминала не открывается.В консоли отладки вывод

Программа загружена.бежать[Переключение на процесс 3424]Ошибка открытия терминала: неизвестно.Бег…

Я могу пойти в папку сборки и просто открыть программу в терминале, но есть ли способ для xcode открыть терминал?

Спасибо за любую помощь!

Ответы [ 3 ]

9 голосов
/ 12 августа 2015

У меня была такая же проблема с отладкой ncurses в Xcode.Наконец, я нашел для меня хороший способ управления отладкой с помощью Terminal.app, который позволяет отлаживать ncurses.

Как мы знаем, для инициализации и использования ncurses нам нужно запустить наше приложение в терминале.Но Xcode не открывает терминал, когда мы нажимаем кнопку запуска.Итак, если мы запросим переменную среды TERM из кода, мы получим NULL.Вот почему приложение аварийно завершает работу в initscr ().

Но Xcode позволяет нам настроить опцию Launch для схемы Run (Product> Scheme> Edit схема ...> Run) вместо «Ожидание запуска исполняемого файла»по умолчанию "Автоматически": Changing Launch option for Run scheme

Теперь мы можем нажать Run в Xcode и после запуска нашего приложения вручную в Terminal.Таким образом, отладчик будет прикреплен к приложению.В этом есть две проблемы:

  1. Если честно, отладчик не присоединится самостоятельно без дополнительных действий и пропустит все точки останова.Но мы можем управлять этим, вызывая getchar () в начале нашей программы.Я решил эту проблему, введя аргумент командной строки, который указывает, что мы отлаживаем в терминале:

    for (int argi = 1; argi < argc; argi++)
    {
        if (strcmp(argv[argi], "--debug-in-terminal") == 0)
        {
            printf("Debugging in terminal enabled\n");
            getchar(); // Without this call debugging will be skipped
            break;
        }
    }
    

    Итак, мы можем включить вызов getchar () только тогда, когда мы хотим отладить внутри Terminal.app

  2. Нам нужно открывать терминал и запускать приложение вручную каждый раз, когда мы нажимаем «Запустить в Xcode».Это действительно раздражает.Итак, я решил автоматизировать его с помощью Pre-actions в настройках схемы Run.Идея состоит в том, чтобы открыть терминал и запустить в нем наше приложение.Но это предварительное действие должно запустить приложение ПОСЛЕ того, как Xcode выполнит действие «Выполнить», чтобы сначала «дождаться запуска исполняемого файла».Поэтому нам нужна фоновая неблокирующая задача с задержкой.Это может быть достигнуто с помощью следующей команды оболочки (и, в конце концов, для запуска в фоновом режиме):

    osascript -e 'tell application "Terminal"' -e 'delay 0.5' -e "set currentTab to do script (\"$TARGET_BUILD_DIR/$PRODUCT_NAME --debug-in-terminal\")" -e 'end tell' &
    

    Не забудьте выбрать приложение в списке «Предоставить параметры сборки из», чтобы сделать его доступным важнымпеременные окружения $ TARGET_BUILD_DIR и $ PRODUCT_NAME: Provide build settings from

    Итак, теперь, когда мы нажимаем Run, Xcode будет ожидать присоединения исполняемого файла, откроется Terminal и наше приложение будет выполнено сопция командной строки --debug-in-terminal и все точки останова будут сработать.

    Довольно приятно, но в конце концов будет лучше закрыть это окно терминала, потому что оно будет генерировать новое для каждой отладки.сессия.Давайте сделаем это в схеме «Пост-действия для запуска»:

    osascript -e 'activate application "Terminal"' -e 'delay 0.5' -e 'tell application "System Events"' -e 'tell process "Terminal"' -e 'keystroke "w" using {command down}' -e 'end tell' -e 'end tell'
    

    enter image description here

    Эта команда просто закрывает окно активного терминала, так что, возможно, эта пост-операцияне требуется, если вы планируете использовать терминал для других целей во время сеанса отладки, потому что вы можете случайно закрыть какое-то важное окно.

И, наконец, идея безопасного кода ncurses, который проверяет,мы можем использовать ncurses или нет:

#include <stdlib.h>
#include <string.h>
#include <ncurses.h>


bool IsTerminalAvailable = false; // Check this global variable before ncurses calls


int main(int argc, const char *argv[])
{
    for (int argi = 1; argi < argc; argi++)
    {
        if (strcmp(argv[argi], "--debug-in-terminal") == 0)
        {
            printf("Debugging in terminal enabled\n");
            getchar(); // Without this call debugging will be skipped
            break;
        }
    }

    char *term = getenv("TERM");

    IsTerminalAvailable = (term != NULL);

    if (IsTerminalAvailable)
        IsTerminalAvailable = (initscr() != NULL);

    // Do some code here....

    if (IsTerminalAvailable)
    {
        printw("Press any key to exit...");
        refresh();

        getch();

        endwin();
    }

    return 0;
}
4 голосов
/ 29 апреля 2011

Нет терминала для подключения в Xcode IDE. Вместо этого запустите программу из оболочки (через приложение Terminal)

./build/Debug/myprogram

Если вы хотите использовать отладчик IDE (это просто gdb), вы можете прикрепить к процессу. Сначала получите идентификатор процесса,

gdb> attach mypid

Для более удобного способа я процитирую Шаг в Xcode: разработка под Mac OS X

Откройте группу «Исполняемые файлы» в Группы и файлы список, выберите приложение, откройте информационное окно и на вкладке «Отладка» снимите флажок Пуск исполняемый файл после запуска отладчика . Когда вы будете готовы к отладке, запустите отладчик, а затем запустите целевое приложение в своем дружественном среда. В отладчике GDB консоль, введите attach myprogram и ваша отладочная сессия идет полным ходом.

2 голосов
/ 15 сентября 2016

В XCode 8 вы можете выбрать запуск в терминале со страницы «Изменить схему ...». XCode 8 screenshot

Хотя в моем быстром тестировании это, кажется, не работает так хорошо; иногда (не всегда) кажется, что он «теряет» отладчика, или отладчик никогда не запускается и думает, что он все еще работает. Если вы попытаетесь выйти, Xcode застревает. Я обнаружил, что если вы найдете, а затем убьете процесс под названием lldb-rpc-server, вы можете избежать принудительного выхода.

Более подробно (если это кому-нибудь помогает), когда отладчик не запускается, я открываю Терминал и набираю

ps x | grep lldb

затем

kill 12345

где 12345 - это идентификатор процесса, который мне дает ps.

...