Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Программирование под Unix/Linux > Среда разработки Cpp с он-лайн перекомпиляцией |
Автор: rvny 8.6.2007, 23:43 |
Здравствуйте! Есть ли среды разработки в линуксе или возможности подобные microsoft visual studio: Т.е. в режиме отладки не только смотреть и изменять переменные, но и добавлять код/удалять код/модифицировать и в дальнешем пошагово продолжать отлаживать программу (с изменным кодом) без повторной остановки программа и запуска с перекомпиляцией. Или в линуксе к сожалению только для просмотра значений можно использовать kdevelp, qdevelop в режиме отладки? |
Автор: bsa 9.6.2007, 23:05 |
На сколько мне известно, под Linux не существует средств (по крайней мере бесплатных), позволяющих модифицировать код во время отладки и автоматически его подцеплять. KDevelop, Code::Blocks и др. позволяют просматривать значения переменных. Не удивлюсь, если и изменять, но я этим никогда не пользовался (или просто забыл). |
Автор: GrayCardinal 10.6.2007, 04:05 |
rvny, Странно. А какой смысл в модифицировании кода во время выполнения ? Может проще поставить пару assert'ов ? |
Автор: powerfox 10.6.2007, 11:52 |
rvny, kdbg. Но сомневаюсь, что такая возможность там есть (в доках не видел). |
Автор: archimed7592 10.6.2007, 13:55 |
вообще то возможности студии "на лету" модифицировать код во время отладки к с++ отношения не имеет - это привилегия .net кода. при модификации unmanaged с++ кода, AFAIK, студия просит пересборку проекта. |
Автор: archimed7592 11.6.2007, 18:02 |
Mayk, точно технологию не знаю, но, вроде как "онлайн" модификация исходника реализуется посредством рефлексии, которую поддерживает .net, но не поддерживает c++(не дай Б-г такое счастье ![]() |
Автор: MAKCim 11.6.2007, 18:41 |
вообще говоря модифицирование кода задача тривиальная не может быть, чтобы в GDB этой операции не было |
Автор: archimed7592 11.6.2007, 18:44 |
MAKCim, че, правда что ль тривиальная? в С++?? а откуда такие выводы? |
Автор: MAKCim 11.6.2007, 18:53 | ||
archimed7592,
как? ![]() |
Автор: nerezus 11.6.2007, 20:00 | ||
![]()
|
Автор: MAKCim 11.6.2007, 20:14 |
nerezus, ![]() |
Автор: archimed7592 11.6.2007, 20:14 |
MAKCim, чего как? или это пример как модифицировать? дык речь о том, что среда сама интерактивно перекомпилирует, пересобирает и каким-то макаром биндит срарое состояние программы на новый образ. проблема в том, что в с++ очень много ньюансов со стеком, с исключениями и тому подобных граблей. если задача и выполнима, то уж точно она не тривиальна. |
Автор: MAKCim 11.6.2007, 20:26 | ||
да
модифицирование кода - действительно тривиальная задача, и я это показал вопрос о том, как это использовать, не стоял, однако я проблемы не вижу |
Автор: archimed7592 11.6.2007, 20:34 | ||
запись в область памяти, в которой располагается код - задача действительно тривиальная. вопрос о самомодификации тоже не стоял ;) я именно об осмысленной модификации говорил, а это - задача уже далеко не тривиальная. ну вот смотри, удалю я определение какой-нибудь переменной, которая сейчас(момент исполнения, в который решили модифицировать код) находится в области видимости. тогда в ещё не модифицированном образе нужно выполнить деструктор для удалённого объекта. а если деструктор бросит исключение? а как сбиндить старое состояние процесса на новой образ? я вижу одни проблемы... |
Автор: MAKCim 11.6.2007, 21:01 | ||||
самомодификация - это всегда модификация, но не наоборот
любое модифицирование - это в любом случае повторная генерация кода (как ты уже заметил в одном из постов) в результате получим исполняемый образ, допустим ELF образ далее сравниваем загруженный образ с только что полученным и сохраняем текущее состояние процесса (важен стек и глобальные данные) (в случае нехватки ОЗУ можно на худой конец диск использовать), причем при сохранении указываем информацию, которая будет необходима для того, чтобы заменить значения соответствующих данных на сохраненные при новом старте образа (при добавлении кода и данных адреса смещаются) далее запускаем новый процесс, который будет исполнять новый образ (формируем его адресное пространство, восстанавливая сохраненную информацию) важно отметить, что модифицирование возможно только еще невыполнявшегося кода, поскольку иначе нельзя |
Автор: Mayk 11.6.2007, 21:59 | ||||||||
Два месяца назад я сдавал лабы на с++, которые были выполнены на winapi без всякого .net'а. При некрупных изменениях всё прекрасно работало.
Вообще поиск даёт положительный ответ на запрос «gdb "fix and continue"» Вот например
Так что основания полагать что gdb это теоретически может уметь есть. Дальнейшие следования по url'ам наводят на (правда это для darwin'а)
но такой команды мой gdb не понимает. ![]() |
Автор: MAKCim 11.6.2007, 22:11 | ||
видно был собран без
|
Автор: rvny 13.6.2007, 10:49 |
А ведь visual studio с 6ой версии кажется это умела делать? Т.е. с 1998 года у микрософт это было! В 2003 с выходом net 1, 1.1 перестала работать (только переменные можно было смотреть). А в 2005 visual studio снова появилось break , modify, and continue Бывает ведь иногда нужно что-то подправить (В значениях переменных), либо дописать проверку, или изменить поведение внутри функции, но не естественно саму функцию (без изменения конечно передаваемых переменных). |