[содержание] [назад] [пред] [вверх] [след] [вперед] 10. интерфейс командной строкивсе кнопки, на которые вы щелкаете в ddd, в результате переводятся в команды отладчика; они показываются в консоли отладчика. вы также можете набирать и редактировать эти команды непосредственно. 10.1 ввод командвы можете общаться с командным интерфейсом подчиненного отладчика в консоли отладчика. вводите команды в подсказке -- это `(gdb)' для gdb, `(dbx)' для dbx, `(ladebug)' для ladebug, `>' для xdb, `>' и `нить[глубина]' для jdb, или `(pydb)' для pydb, или `db<>' для perl. вы можете использовать любые команды отладчика; для ввода набирайте клавишу return. 10.1.1 завершение командпри использовании gdb или perl вы можете завершать команды и аргументы, нажимая tab. это работает в консоли отладчика, а также во всех остальных текстовых окнах. gdb может дополнить для вас остаток слова команды, если есть только один вариант; он также может в любое время показать допустимые варианты следующего слова команды. это работает для команд gdb, подкоманд gdb и имен символов вашей программы. нажимайте клавишу tab всякий раз, когда вы хотите, чтобы gdb дополнил остаток слова. если есть только один вариант, gdb дополняет слово и ждет, пока вы завершите команду (или нажмете ret для ее ввода). например, если вы наберете (gdb) info bre tab
gdb дополнит остаток слова `breakpoints', поскольку это
единственная подкоманда (gdb) info breakpoints
теперь вы можете либо нажать ret, чтобы запустить команду
если есть несколько вариантов следующего слова, то когда вы нажимаете tab, ddd издает звуковой сигнал. вы можете либо набрать больше знаков и попробовать снова, либо просто нажать tab второй раз; gdb покажет все варианты завершения этого слова. например, вы можете захотеть установить точку останова на подпрограмме, чье имя начинается на `make_', но когда вы набираете b make_tab, ddd просто пищит. если вы снова нажмете tab, будут показаны имена всех функций из вашей программы, которые так начинаются. если вы еще раз нажмете tab, вы будете проходить по списку завершений, например: (gdb) b make_ tab ddd выдает сигнал; снова нажмите tab и увидите вот это: make_a_section_from_file make_environ make_abs_section make_function_type make_blockvector make_pointer_type make_cleanup make_reference_type make_command make_symbol_completion_list (gdb) b make_ tab ddd предоставляет одно дополнение за другим: (gdb) b make_a_section_from_file tab (gdb) b make_abs_section tab (gdb) b make_blockvector tab показав возможные варианты, gdb копирует незавершенный ввод (в этом примере `b make_'), чтобы вы могли закончить команду -- повторно нажав tab или введя остаток вручную.
иногда вам нужна такая строка, которая хотя логически и является
"словом", но содержит скобки или другие знаки, которые gdb обычно
не включает в свое понятие слова. чтобы завершение слов работало в
таких случаях, вы можете заключать слова в командах gdb в одиночные
кавычки (
наиболее вероятна ситуация, когда вам это понадобилось для набора имени
функции си++. это так, потому что си++ допускает перезагрузку функций
(разные определения одной функции, отличающиеся типом аргумента).
например, когда вы хотите поставить точку останова, вам может
понадобиться указать, имеете ли вы в виду версию (gdb) b 'bubble( tab bubble(double,double) bubble(int,int) (gdb) b 'bubble( в некоторых случаях ddd может понять, что для завершения имени требуется поставить кавычки. когда это происходит, ddd вставляет кавычку за вас (завершая в то же время насколько может), если вы сначала не набрали ее: (gdb) b bub tab ddd изменяет введенную вами строку на показанную ниже и выдает звуковой сигнал: (gdb) b 'bubble( вообще, ddd может понять, когда нужна кавычка (и вставляет ее), если в момент запроса завершения перезагруженного символа вы еще не начали набирать список аргументов. если вы предпочитаете использовать клавишу tab для переключения между объектами, снимите установку `edit => preferences => general => tab key completes in all windows'. это полезно в том случае, если фокус клавиатуры управляется указателем мыши (смотрите ниже), а у клавиши tab нет особого назначения. если эта установка включена, клавиша tab завершает только в консоли отладчика. данная установка привязана к такому ресурсу:
10.1.2 история командвы можете повторить предыдущие и последующие команды, нажимая стрелки up и down, соответственно. это подставляет более ранние или более поздние команды в командную строку; чтобы применить текущую команду, нажмите return. если вы введете пустую строку (просто нажмете return в подсказке отладчика), будет повторена последняя команда. `commands => command history' показывает историю команд.
вы можете запустить поиск предыдущих команд, нажав ctrl+b. это вызывает режим наращиваемого поиска, где вы можете ввести строку, которую следует искать в предыдущих командах. чтобы повторить поиск, нажмите ctrl+b еще раз, а для поиска в обратном направлении используйте ctrl+f. чтобы вернуться в обычный режим, нажмите esc или наберите любую команду управления курсором. история команд автоматически сохраняется при выходе из ddd. вы можете выключить эту возможность, установив следующий ресурс в значение `off':
10.2 ввод команд с терминалавместо того чтобы вводить команды с консоли отладчика, вы, возможно, предпочтете набирать их в окне терминала, из которого был вызван ddd.
когда ddd вызывается с ключом
по умолчанию, если ddd был вызван с ключом
ddd можно настроить на использование библиотеки `readline' для
чтения команд со стандартного ввода. эта библиотека gnu
предоставляет единый пользовательский интерфейс для программ,
управляемых из командной строки. ее преимущества: редактирование команд
"на месте" в стиле gnu emacs или 10.3 интегрирование dddвы можете запускать ddd как подчиненный отладчик в других интерфейсах для отладчиков, комбинируя их возможности с возможностями ddd.
чтобы запустить ddd в качестве подчиненного отладчика в другой
интерфейсной программе, нужно настроить ее так, чтобы вместо ее
подчиненного отладчика работал бы `ddd --tty'. когда
ddd вызывается с ключом
в том случае, если ваш интерфейс отладчика использует ключ gdb
если запустить ddd с ключом 10.3.1 использование ddd с emacs
чтобы интегрировать ddd с emacs, наберите в emacs m-x gdb или
m-x dbx, чтобы запустить сеанс отладки. в подсказке введите
10.3.2 использование ddd с xemacs
чтобы интегрировать ddd с xemacs, установите переменную
(setq gdb-command-name "ddd") кроме того, можно вычислить это выражение, нажав esc : и введя его непосредственно (esc esc в xemacs 19.13 и более ранних). чтобы запустить из xemacs сеанс отладки ddd, используйте `m-x gdb' или `m-x gdbsrc'. далее работайте как обычно. 10.3.3 использование ddd с @acronym{xxgdb}
чтобы интегрировать ddd с @acronym{xxgdb}, вызовите xxgdb -db_name ddd -db_prompt '(gdb) ' 10.4 определение кнопокдля упрощения взаимодействия с ddd вы можете добавлять свои собственные командные кнопки. можно добавлять кнопки внизу консоли отладчика (`кнопки консоли'), окна исходного кода (`кнопки исходника') или окна данных (`кнопки данных'). для определения отдельных кнопок служит редактор кнопок, вызываемый через `commands => edit buttons'. редактор кнопок показывает текст, где каждая строка содержит команду для одной кнопки. щелчок на `ok' создает соответствующие этому тексту кнопки. если текст пуст (по умолчанию), кнопки не создаются. в качестве простого примера, предположим, что вы хотите создать кнопку `print i'. вызовите `commands => edit buttons' и введите в редакторе кнопок строку `print i'. затем щелкните на `ok'. тогда внизу консоли отладчика появится кнопка с именем `print i' -- попробуйте применить ее! чтобы удалить эту кнопку, снова откройте редактор кнопок, очистите строку `print i' и нажмите `ok'. если команда кнопки содержит `()', строка `()' будет автоматически заменяться на содержимое поля аргумента. к примеру, кнопка с именем `return ()' будет выполнять команду gdb `return', передавая ей текущее содержимое поля аргумента. по умолчанию ddd выключает все кнопки, чьи команду не поддерживаются подчиненным отладчиком. чтобы задействовать их, снимите переключатель `enable supported buttons only' в редакторе кнопок.
кроме того, ddd позволяет задавать для определяемых пользователем кнопок управляющие последовательности и метки. см. раздел 10.4.1 настройка кнопок, для получения подробностей. 10.4.1 настройка кнопокddd позволяет определять дополнительные командные кнопки; см. раздел 10.4 определение кнопок. данный раздел описывает ресурсы, контролирующие определяемые пользователем кнопки.
следующие ресурсы определяют кнопки более подробно:
10.5 определение командкроме команд для точек останова (см. раздел 5.1.8 команды точек останова), ddd также позволяет вам определять свои команды. определяемая пользователем команда -- это последовательность команд, которой вы присвоили собственное имя как отдельной команде. эту новую команду можно вводить в подсказке отладчика или вызывать по кнопке. 10.5.1 определение простых команд с использованием gdbкроме команд для точек останова (см. раздел 5.1.8 команды точек останова), ddd также позволяет вам записывать последовательности команд в качестве новой, определенной пользователем команды gdb. определяемая пользователем команда -- это последовательность команд gdb, которой вы придали новое имя как команде. в ddd для этой цели служит редактор команд, который вызывается через `commands => define command'. команда gdb создается в пять шагов:
когда команда определена, вы можете вводить ее в подсказке gdb. кроме того, любую определенную пользователем команду можно применить, щелкнув на `apply'. для удобства работы вы можете назначить для новой команды кнопку. если включить одно из положений `button', в указанном месте добавится кнопка с этой командой. если вы хотите отредактировать эту кнопку, выберите `commands => edit buttons'. см. раздел 10.4 определение кнопок, обсуждение этой темы.
когда выполняются определенные пользователем команды gdb, команды, составляющие ее определение, не печатаются. ошибка в любой из команд последовательности приводит к останову выполнения.(33) команды, которые обычно запрашивают подтверждение, не задают вопросов при интерактивном использовании, если они находятся внутри определенной пользователем команды. многие команды gdb, которые обычно печатают сообщения о том, что они делают в данный момент, не выводят этих сообщений при использовании из определенной пользователем команды. чтобы сохранить все определения команд, используйте `edit => save options'. 10.5.2 определение команд с аргументами с использованием gdbесли вы хотите передать определяемой пользователем команде аргументы, вы можете включить переключатель `()' в редакторе команд. это приводит к двум результатам:
в процессе определения команды вы можете как угодно переключать кнопку `()', переходя от символьной подстановки поля аргумента к буквальной.
в качестве примера давайте определим команду
у команд с аргументами есть маленький недостаток: у определяемой пользователем команды gdb нет никакой возможности получить доступ ко всему списку аргументов целиком; обрабатывается только первый аргумент (до пропуска). в будущих выпусках gdb это может измениться. 10.5.3 определение команд с использованием других отладчиковесли ваш подчиненный отладчик позволяет определять свои собственные последовательности команд, вы также можете использовать эти пользовательские команды из ddd; просто вводите их в подсказке отладчика. однако, вы можете столкнуться с некоторыми проблемами:
для решения этих проблем ddd предоставляет простое средство, так называемые автокоманды. если ddd получает от подчиненного отладчика какой-либо вывод вида `префикс команда', он интерпретирует команду, как если бы она была введена в подсказке отладчика. префикс -- это определяемая пользователем строка, например `ddd: '.
допустим, вы хотите определить команду ddd: graph display аргумент
где аргумент -- это аргумент define gd echo ddd: graph display $arg0\n end чтобы закончить подготовку, вы должны также установить ресурс `autocommandprefix' в значение префикса, который вы написали в команде, `ddd: '. напишите в файле `~/.ddd/init': ddd*autocommandprefix: ddd:\ (не забудьте поставить после обратной косой черты пробел.)
теперь ввод пожалуйста, обратите внимание: для своих команд вам лучше выбрать какой-нибудь другой префикс, не `ddd: '. это нужно делать, потому что автокоманды создают проблему с защитой, ведь выполнять можно любые команды. только представьте себе, что некая злобная программа пишет во время отладки строку вроде `префикс shell rm -fr ~'! поэтому обязательно придумайте свой собственный префикс; его длина должна быть не меньше трех знаков. [содержание] [назад] [пред] [вверх] [след] [вперед] |