2015-02-13 2 views
2

Я использую GDB с консоли в предварительно сконфигурированной среде, а версия, которую он предоставляет, содержит несколько ошибок. Самый обидный, один является то, что иногда, когда вступает в функцию или добавление точки останова или печать стеки вызовов, он извергает сотни последовательных линий, подобные этому:Altering/Filtering Выход GDB в режиме консоли

warning: Range for type (null) has invalid bounds 0..-103 

Единственной ссылку, которую я мог бы найти для этого вопроса here и это не полезно.

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

  1. проинструктировать GDB для подавления таких предупреждений - выглядит как тупик. Насколько я могу судить, GDB не позволяет пользователям подавлять такие предупреждения.

  2. перехватить их в крюке через .gdbinit - кажется многообещающим. Я смог изменить цвет терминала, например, просунув файл .gdbinit, указанный в this answer. К сожалению, я не нашел никакого крючка в the documentation, который был бы полезен для моей цели.

  3. фильтровать предупреждения (возможно, через какой-то прокси-сервер между stdout и GDB) - чувствует себя хакерским, но я бы не прочь сделать это, если бы это как-то сработало. Глупой попыткой было перенаправить stderr на /dev/null следующим образом: gdb -p xxxxxx 2> /dev/null, но похоже, что предупреждения фактически вытолкнуты на stdout. Облом. Затем я также подумал, что, может быть, я мог бы сделать что-то глупое, например, фильтровать stdout через grep, например gdb -p xxxxxx | grep -v ^warning, но это, по-видимому, имеет нежелательный побочный эффект, вызвав невидимую подсказку терминала по какой-то причине.

Есть ли у кого-нибудь идеи, что может сработать? Я много искал для чего-то, что могло бы помочь мне реализовать третью идею, но до сих пор я вышел с пустыми руками ...

+0

Просто теория: возможно, избежать ошибок можно, слегка манипулируя символической информацией внутри двоичного кода. Я знаю, что есть некоторые инструменты для выделения выделенных символов. Похоже, ваш gdb неправильно истолковывает некоторые типы массивов. Но я понятия не имею, как это сделать (и это все равно уменьшит функциональность отладчика). –

+0

В моей ситуации это звучит как боль в заднице, чем просто получение более новой версии GDB ... И снова, действительно, это еще один вариант на столе, но я думаю, мне нужно углубиться в внутренние части GDB, чтобы выяснить, что на самом деле это не нравится из этих символов массива. –

+1

Если у вас есть компилятор C, легко выполнить эту простую версию [script] (http://man7.org/tlpi/code/online/dist/pty/script.c.html), удалите части, которые записываются в файл журнала, и добавьте код, чтобы отфильтровать любые строки, которые вы не хотите видеть. –

ответ

1

Во-первых, в gdb нет способа фильтровать предупреждения. Механизм предупреждения не программируется из CLI или уровня Python.

Модернизация gdb может помочь - но это может быть не так. Из моего чтения ссылки, которую вы предоставили, похоже, что проблема связана с массивами переменной длины Fortran («VLA»). В последнее время я слышал, что эта функция все еще обрабатывается в gdb. Это стоит попробовать, но я бы не стал рассчитывать на это.

Если предупреждение не мешает вашей работе, вы можете просто взломать gdb, чтобы удалить предупреждение. Это должно быть довольно просто - проще, чем следующая идея.

Если вы действительно хотите, чтобы оболочка устранила предупреждения, (1) запустите gdb в emacs и взломайте некоторые elisp, чтобы удалить эти сообщения; или (2) используйте expect, чтобы обернуть командную строку gdb тем, что бросает предупреждения.

+0

Хотя это было бы привлекательным для взлома GDB и удаления глупого предупреждения, это наименее переносная вещь, а также создание GDB ... Ваше предложение использовать «emacs» или «expect» звучит многообещающе, и я мог бы дать ему но я надеялся на гораздо более простое решение, вроде скрипта bash, который выступает в роли прозрачной оболочки для GDB. Кажется, что это должно быть легко сделать, но каким-то образом я не могу найти какой-либо полезный пример ... –

+0

Это зависит от вас, но IMO во много раз проще grep для предупреждения и взломать его, чем он это написать эту оболочку. gdb не имеет много зависимостей. Тем не менее, вы можете попробовать существующую оболочку для gdb, используя MI, например cgdb. –

Смежные вопросы