Извините, если вопрос сформулирован неверно - я не знаю правильного слова для того, что я прошу! :)
Скажем, у вас есть простая программа на C, например:
#include <stdio.h>
int main()
{
int a=2;
printf("Hello World %d\n", a);
return 0;
}
Как правило, это должно быть сохранено в файле (скажем, hello.c
); затем мы запускаем gcc
в исходном файле и получаем исполняемый файл - и если мы скомпилировали отладочную информацию, то мы можем использовать gdb
в исполняемом файле, чтобы проходить по строкам кода и проверять переменные.
То, что я хотел бы иметь, это в основном своего рода оболочка "C" - похожая на оболочку Python; в том смысле, что я могу иметь последовательность команд Python в файле (скрипт) - или я могу просто вставить те же команды в оболочку, и они будут выполняться одинаково. Что касается простой программы, описанной выше, это то, что я хотел бы сделать (где C>
представляет воображаемое приглашение):
C> #include <stdio.h>
(stdio.h included)
C> int a=2;
C> printf("Hello World %d\n", a);
Hello World 2
C>
Другими словами, я хотел бы иметь возможность выполнять отдельные команды C в интерактивном режиме ( Я предполагаю, что это будет представлять сортировку на лету? ). Первоначально меня вводило в заблуждение название оболочки C (csh
) - но я не думаю, что она сможет выполнять команды C на лету.
Итак, прежде всего, я хотел бы знать, можно ли как-то убедить, скажем, gdb
действовать таким образом? Если нет, есть ли что-нибудь еще, что позволило бы мне сделать что-то подобное (возможно, какую-то специальную оболочку)?
Что касается контекста - у меня есть некоторый код, где у меня возникают проблемы с устранением неполадок, связанных с указателями между структурами и т. здесь способ gdb может распечатывать структуры работает очень хорошо - однако, чтобы изолировать проблему, я должен создать новые исходные файлы, вставить данные, скомпилировать и снова отладить. В этом случае, я бы предпочел иметь возможность вставить несколько структур (и их команды инициализации) в какую-то оболочку - и затем проверить, используя printf
(или даже лучше, что-то похожее на gdb
). print
) набирается прямо на оболочке.
Просто для протокола - я не особо убежден, что что-то вроде этого действительно существует; но я все равно хотел спросить :)
Заранее спасибо за любые ответы,
Ура!
РЕДАКТИРОВАТЬ : Я был немного занят, поэтому еще не успел просмотреть все ответы для принятия (извините :)); Я просто хотел добавить небольшой комментарий: « интерпретируется против машинного кода »; или как упомянуто @doron:
Проблема с интерактивным запуском исходного кода C / C ++ заключается в том, что
компилятор не может выполнять построчную интерпретацию кода.
Я полностью осведомлен об этом - но давайте представим приложение командной строки (может даже интерпретируемое), которое выдает подсказку с интерфейсом командной строки. В начале, давайте предположим, что это приложение генерирует этот простой «текстовый файл» в памяти:
@@HEADER@@
int main()
{
@@MAIN@@
return 0;
}
Затем приложение просто ожидает ввода текста в приглашении и нажатия клавиши ENTER; и по новой строке:
- Приложение проверяет:
- если строка начинается с
#define
или #include
, то она добавляется ниже @@HEADER@@
- но выше int main()
строки - во временном файле
- что-нибудь еще, идет ниже
@@MAIN@@
строки - но выше return 0;
строки - во временном файле
- временный файл очищается от
@@HEADER@@
и @@MAIN@@
строк и сохраняется на диск как temp.c
gcc
вызывается для компиляции temp.c
и генерации temp.out
исполняемого файла
- если не получится, уведомить пользователя, выйти
gdb
вызывается для запуска исполняемого файла temp.out
с точкой останова, установленной в строке return 0;
- если не получится, уведомить пользователя, выйти
- выполнение возвращается в подсказку; следующие команды, которые вводит пользователь, фактически передаются в
gdb
(, поэтому пользователь может использовать такие команды, как p variable
для проверки ) - пока пользователь не нажмет, скажем, Ctrl + 1 для выхода gdb
- Ctrl + 1 -
gdb
выходит, управление возвращается нашему приложению - которое снова ждет следующей строки кода .. и т. Д. - (последующие записи строки кода хранятся во временном файле -находится ниже последней записи из той же категории)
Очевидно, я не ожидал, что смогу вставить весь код ядра Linux в такое приложение, и ожидатьэто сработает :) Однако я ожидал, что смогу вставить через пару struct
с и проверить результаты таких утверждений, как, скажем:
char dat = (char) (*(int16_t*)(my->structure->pdata) >> 32 & 0xFF) ^ 0x88;
... так что я 'Я уверен в том, какой правильный синтаксис использовать (с которым я обычно и сталкиваюсь) - без накладных расходов на перестройку и отладку всего программного обеспечения, просто чтобы выяснить, должен ли я переместить правильную скобкудо или после знака звездочки ( в тех случаях, когда такое действие не приводит к ошибке компиляции, конечно ).
Теперь я не уверен во всем объеме проблем, которые могут возникнуть из-за упрощенной архитектуры приложений, как указано выше.Но это пример, который просто указывает, что что-то вроде «оболочки C» (для относительно простых сессий / программ) было бы концептуально выполнимо, также используя gcc
и gdb
- без каких-либо серьезных столкновений с, в противном случае,строгое различие между «машинным кодом» и «интерпретируемыми» языками.