Eclipse / CDT Pretty Print Ошибки

Позвольте мне начать с того, что я рассмотрел другие вопросы, которые здесь невероятно тесно связаны, но не позволили решить мою проблему.

Настроить:

  • Ноутбук Win7, SSH / X11 — CentOS 6.4 Окончательно работает Eclipse Kepler SR2 с CDT 8.3
  • ГБД 7,2
  • Управляемый корпоративный сервер, который не имеет доступа к Интернету (поэтому нет svn co...)

Я новичок в использовании Eclipse / CDT, но знаком с GDB. Когда я пытаюсь отладить приложение, которое использует STL, при первом появлении объекта STL я получаю следующие ошибки. В программах с большим количеством объектов STL я получаю так много ошибок, что это делает невозможным пошаговое выполнение. У меня есть небольшой пример программы для иллюстрации.

Вот мой пример программы:

#include <iostream>
using namespace std;

int main() {
string sComplex;
sComplex = "!!!Hello World!!!";
cout << sComplex << endl; // prints !!!Hello World!!!
//cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
cout << "This is a new string that writes out a numeric..." << endl;
int i = 1000;
cout << "Value for integer 'i' is : '" << i << "'." << endl;
cout << "  In HEX: '";
cout << std::hex << std::showbase << i;
cout << "'." <<endl;
return 0;
}

Вот ошибки, которые выводятся, как только он попадает в первую строку (создание строки STL):

Traceback (последний вызов был последним):
Файл «/usr/lib64/../share/gdb/python/libstdcxx/v6/printers.py», строка 558, в to_string
вернуть self.val [‘_ M_dataplus’] [‘_ M_p’]. lazy_string (length = len)
RuntimeError: Невозможно получить доступ к памяти по адресу 0xffffffffffffffe8

Traceback (последний вызов был последним):
Файл «/usr/lib64/../share/gdb/python/libstdcxx/v6/printers.py», строка 558, в to_string
вернуть self.val [‘_ M_dataplus’] [‘_ M_p’]. lazy_string (length = len)
RuntimeError: Невозможно получить доступ к памяти по адресу 0xffffffffffffffe8

Traceback (последний вызов был последним):
Файл «/usr/lib64/../share/gdb/python/libstdcxx/v6/printers.py», строка 558, в to_string
вернуть self.val [‘_ M_dataplus’] [‘_ M_p’]. lazy_string (length = len)
RuntimeError: Невозможно получить доступ к памяти по адресу 0xffffffffffffffe8

Во-первых, обратите внимание, что есть 3 отдельные ошибки для этого одного объекта. Я проверил, что установлен модуль python pretty print, и я попробовал предложения по ограничению длины в нанизывать, но безрезультатно. Если я перехожу за пределы экземпляра строки, все работает нормально, и я вижу простое строковое значение переменной. Мышь тоже выглядит хорошо. Когда я отлаживаю это же приложение, используя gdb прямо в командной строке, я не вижу таких ошибок и выводим значения переменных хорошенький.

(gdb) p sComplex
$1 = "!!!Hello World!!!"(gdb) p sComplex.c_str()
$2 = 0x602028 "!!!Hello World!!!"

Я пробовал разные предложения с моим файлом .gdbinit и настройками Eclipse Window-> Preferences-> C / C ++ -> Debug-> GDB, даже отключив симпатичную печать, но это все же происходит. Я не знаю, что еще попробовать дальше.

1

Решение

Я отправил тикет в Eclipse (Красивые ошибки печати делают невозможным отладку Eclipse) и ответ от Marc Dumais указывает, что эта ошибка является результатом дефекта в GDB. До тех пор, пока GDB не будет исправлен, единственный способ обойти эту ошибку, используя красивую печать в Eclipse (согласно предложению Марка), — это скрыть все активные переменные окна / вкладки. Это не позволяет Eclipse запрашивать у GDB начальные значения для переменных, которые еще не могут быть инициализированы.

Устранение этой проблемы просто с помощью вкладки «Переменные» в перспективе «Отладка». Это решение может зависеть от кода в этом коде, и многие неинициализированные переменные все еще могут быть трудны для отладки.

0

Другие решения

Я, наконец, решил вернуться к этой проблеме и, наконец, решил ее, следуя решениям, аналогичным этот, и путем дополнительного редактирования моих пользовательских printers.py. Надеюсь, это поможет кому-то еще, кто ударил это.

  1. Оформить симпатичные принтеры (svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python) чтобы $HOME/gdb/gdb_printers/,
    • Если вы не можете оформить заказ (если ваша организация блокирует внешний svn, как у меня), посмотрите, можете ли вы скопировать его из системного расположения (например, /usr/share/gdb/).
      Вы должны иметь такую ​​структуру каталогов, когда закончите:

GDB принтер дерево

Эта структура должна быть ТОЧНОЙ, иначе она не будет использовать ваш printers.py в / v6 /.

  1. Отредактируйте printers.py, в частности StdStringPrinter::to_string следующим образом (добавив try / кроме / else):

    def to_string(self):
    # Make sure &string works, too.
    type = self.val.type
    if type.code == gdb.TYPE_CODE_REF:
    type = type.target ()
    
    # Calculate the length of the string so that to_string returns
    # the string according to length, not according to first null
    # encountered.
    # I wrapped this section in a try/except/else block so that uninitialized
    # strings don't cause massive RuntimeError exception reporting during debugging
    # with or without pretty printers enabled. -jkw
    try:
    ptr = self.val ['_M_dataplus']['_M_p']
    realtype = type.unqualified ().strip_typedefs ()
    reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer ()
    header = ptr.cast(reptype) - 1
    len = header.dereference ()['_M_length']
    except RuntimeError:
    #print 'Caught exception'
    return ''
    else:
    return self.val['_M_dataplus']['_M_p'].lazy_string (length = len)
    
  2. Создание / редактирование $HOME/gdb/.gdbinit файл и вставьте в него следующее. Обратите внимание, что путь должен совпадать с путем к каталогу ‘python’ в приведенном выше представлении изображения / дерева.

     python
    import sys
    sys.path.insert(0, '/home/(user_id)/gdb/gdb_printers/python')
    from libstdcxx.v6.printers import register_libstdcxx_printers
    register_libstdcxx_printers (None)
    end
    
  3. В Затмении, под Window -> preferences -> C/C++ -> Debug -> GDBустановите путь к gdb и ваш .gdbinit файл. Вы также может необходимо установить это в любых существующих конфигурациях отладки, которые вы хотите использовать в вашем printers.py.

    GDB debugger: /usr/bin/gdb
    GDB command file: /home/(user_id)/gdb/.gdbinit
    

Оттуда, функции отладки, как вы думаете, должны.

0

По вопросам рекламы [email protected]