Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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, студия просит пересборку проекта.

Автор: Mayk 11.6.2007, 17:57
Цитата(archimed7592 @  10.6.2007,  17:55 Найти цитируемый пост)
вообще то возможности студии "на лету" модифицировать код во время отладки к с++ отношения не имеет - это привилегия .net кода. при модификации unmanaged с++ кода, AFAIK, студия просит пересборку проекта. 

Incremental link действительно имеет отношение к с++ не более чем к фортрану.  В конце концов .exeшники собирают linker'ы.
VS вполне сносно позволяет модифицировать немного umanaged кода в рантайме. 


Цитата(rvny @  9.6.2007,  03:43 Найти цитируемый пост)

Т.е. в режиме отладки не только смотреть и изменять переменные, но и добавлять код/удалять код/модифицировать и в дальнешем пошагово продолжать отлаживать программу (с изменным кодом)  без повторной остановки программа и запуска с перекомпиляцией.



Поиск в гугле говорит, что в природе есть
Цитата(http://docs.sun.com/source/806-3567/ild.html)

ild is an incremental version of the Link Editor ld, and replaces ld for linking programs. Use ild to complete the edit, compile, link, and debug loop efficiently and more quickly. You can avoid relinking entirely by using the fix and continue feature of dbx which allows you to work without relinking. However, if you need to relink, the process can be faster if you use ild. For more information on fix and continue, see Chapter 11 in Debugging a Program With dbx.


Из док-ии по названному dbx
Цитата(далее по ссылке)

The advantages of using fix and continue are:
--8<--
    * You can resume running the program from the fix location. 


Поиск по ключевым словам "    sun    studio    linux    fix    continue " http://209.85.165.104/search?q=cache:HcRhva-Xa18J:sun.systemnews.com/g%3FA%3D13528+sun+studio+linux+fix+continue&hl=ru&ct=clnk&cd=1&gl=us

Цитата(даю ссылку на гугл @  так как прямая ссылка просит регистрацию)


Sun Studio 9 for Solaris OS and Linux
Significant Improvements in SPARC, Xeon and AMD Performance


Immediate availability of the Linux version of SunTM Studio 9 development tools for C, C++ and Fortran was announced by Sun at the LinuxWorld Conference held in San Francisco.

Also available for the SolarisTM Operating System (Solaris OS), Sun Studio 9 provides a comprehensive, productive environment for developing scalable 32-bit and 64-bit applications on the latest Sun UltraSPARCR IV, Intel Xeon and AMD-based systems.

For the Linux environment, this software offers NetBeansTM-based IDE with editor of choice (Vim, XEmacs, built-in); distributed make (dmake); GUI debugger (dbx) for GCC binaries; performance tools and X-Designer GUI Builder. 
....
Simplified Debugging: Graphical user interface allows for easy access to advanced debugging features. Set breakpoints, examine variables and navigate the call stack through debugger menus and buttons. Reduce turnaround time for fixes and achieve greater debugging productivity with "Fix and Continue." Debug optimized and parallelized code as well as mixed languages (C, C++, Fortran, and Java).

Так что есть основания полагать что fix'n'continue в linux мире существует.

Про другие IDE  и более свежие версии sun studio искать лень.

Автор: archimed7592 11.6.2007, 18:02
Mayk, точно технологию не знаю, но, вроде как "онлайн" модификация исходника реализуется посредством рефлексии, которую поддерживает .net, но не поддерживает c++(не дай Б-г такое счастье smile)

Автор: MAKCim 11.6.2007, 18:41
вообще говоря модифицирование кода задача тривиальная
не может быть, чтобы в GDB этой операции не было

Автор: archimed7592 11.6.2007, 18:44
MAKCim, че, правда что ль тривиальная? в С++?? а откуда такие выводы?

Автор: MAKCim 11.6.2007, 18:53
archimed7592
Код

#include <sys/mman.h>
#include <stdio.h>

static int foo() {
    return 0;
}

int main() {
    mprotect((void*)(&foo - (int)&foo % 4096), 4096, PROT_READ | PROT_WRITE | PROT_EXEC;
    ++*((int*)&foo + 1);
    printf("%d\n", foo());
    return 0;
}

как?  smile (компилировать без оптимизации gcc <name>.c -o <name>)

Автор: nerezus 11.6.2007, 20:00
 smile 

Цитата

++*((int*)&foo
 спасибо, а вот монитор оттирать мне придется =\

Автор: MAKCim 11.6.2007, 20:14
nerezus
 smile 

Автор: archimed7592 11.6.2007, 20:14
MAKCim, чего как? или это пример как модифицировать? дык речь о том, что среда сама интерактивно перекомпилирует, пересобирает и каким-то макаром биндит срарое состояние программы на новый образ. проблема в том, что в с++ очень много ньюансов со стеком, с исключениями и тому подобных граблей. если задача и выполнима, то уж точно она не тривиальна.

Автор: MAKCim 11.6.2007, 20:26
Цитата(archimed7592 @  11.6.2007,  20:14 Найти цитируемый пост)
или это пример как модифицировать?

да
Цитата(archimed7592 @  11.6.2007,  20:14 Найти цитируемый пост)
дык речь о том, что среда сама интерактивно перекомпилирует, пересобирает и каким-то макаром биндит срарое состояние программы на новый образ. проблема в том, что в с++ очень много ньюансов со стеком, с исключениями и тому подобных граблей. если задача и выполнима, то уж точно она не тривиальна. 

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

Автор: archimed7592 11.6.2007, 20:34
Цитата(MAKCim @  11.6.2007,  20:26 Найти цитируемый пост)
модифицирование кода - действительно тривиальная задача, и я это показал

запись в область памяти, в которой располагается код - задача действительно тривиальная.

Цитата(MAKCim @  11.6.2007,  20:26 Найти цитируемый пост)
вопрос о том, как это использовать, не стоял

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

ну вот смотри, удалю я определение какой-нибудь переменной, которая сейчас(момент исполнения, в который решили модифицировать код) находится в области видимости. тогда в ещё не модифицированном образе нужно выполнить деструктор для удалённого объекта. а если деструктор бросит исключение? а как сбиндить старое состояние процесса на новой образ? я вижу одни проблемы...

Автор: MAKCim 11.6.2007, 21:01
Цитата(archimed7592 @  11.6.2007,  20:34 Найти цитируемый пост)
вопрос о самомодификации тоже не стоял ;)

Цитата(MAKCim @  11.6.2007,  18:41 Найти цитируемый пост)
вообще говоря модифицирование кода задача тривиальная

Цитата(archimed7592 @  11.6.2007,  18:44 Найти цитируемый пост)
MAKCim, че, правда что ль тривиальная? в С++?? а откуда такие выводы? 

самомодификация - это всегда модификация, но не наоборот
Цитата(archimed7592 @  11.6.2007,  20:34 Найти цитируемый пост)
ну вот смотри, удалю я определение какой-нибудь переменной, которая сейчас(момент исполнения, в который решили модифицировать код) находится в области видимости. тогда в ещё не модифицированном образе нужно выполнить деструктор для удалённого объекта. а если деструктор бросит исключение? а как сбиндить старое состояние процесса на новой образ? я вижу одни проблемы... 

любое модифицирование - это в любом случае повторная генерация кода (как ты уже заметил в одном из постов)
в результате получим исполняемый образ, допустим ELF образ
далее сравниваем загруженный образ с только что полученным и сохраняем текущее состояние процесса (важен стек и глобальные данные) (в случае нехватки ОЗУ можно на худой конец диск использовать), причем при сохранении указываем информацию, которая будет необходима для того, чтобы заменить значения соответствующих данных на сохраненные при новом старте образа (при добавлении кода и данных адреса смещаются)
далее запускаем новый процесс, который будет исполнять новый образ (формируем его адресное пространство, восстанавливая сохраненную информацию)
важно отметить, что модифицирование возможно только еще невыполнявшегося кода, поскольку иначе нельзя

Автор: Mayk 11.6.2007, 21:59
Цитата(archimed7592 @  11.6.2007,  22:02 Найти цитируемый пост)
Mayk, точно технологию не знаю, но, вроде как "онлайн" модификация исходника реализуется посредством рефлексии, которую поддерживает .net, но не поддерживает c++(не дай Б-г такое счастье

Два месяца назад я сдавал лабы на с++, которые были выполнены на winapi без всякого .net'а. При некрупных изменениях всё прекрасно работало. 

Цитата(MAKCim @  11.6.2007,  22:41 Найти цитируемый пост)
вообще говоря модифицирование кода задача тривиальная
не может быть, чтобы в GDB этой операции не было 

Вообще поиск даёт положительный ответ на запрос «gdb "fix and continue"»
Вот например
Цитата(http://www.ecos.sourceware.org/ml/gdb/2006-03/msg00162.html)

we have implemented a new GDB/GCC feature to fix a modified C source code into
a running program like it is done with DBX at Solaris. Is there any interest to include 
this changes into the GDB/GCC repository. This changes have only been done
for x86 systems.


Так что основания полагать что gdb это теоретически может уметь есть.
Дальнейшие следования по url'ам наводят на (правда это для darwin'а)
Цитата(darwingrok.physics.ox.ac.uk:8080/source/xref/gdb/src/gdb/fix-and-continue.c - )

  const char *usage = "Usage: fix bundle-filename source-filename [object-filename]";

но такой команды мой gdb не понимает. smile 


Автор: MAKCim 11.6.2007, 22:11
Цитата(Mayk @  11.6.2007,  21:59 Найти цитируемый пост)
но такой команды мой gdb не понимает

видно был собран без
Цитата

fix-and-continue.c

Автор: rvny 13.6.2007, 10:49
А ведь visual studio с 6ой версии кажется это умела делать? Т.е. с 1998 года у микрософт это было!
В 2003 с выходом net 1, 1.1 перестала работать (только переменные можно было смотреть).
А в 2005 visual studio снова появилось break , modify, and continue

Бывает ведь иногда нужно что-то подправить (В значениях переменных), либо дописать проверку, или изменить поведение внутри функции, но не естественно саму функцию (без изменения конечно передаваемых переменных).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)