Позвольте мне начать с того, что я рассмотрел другие вопросы, которые здесь невероятно тесно связаны, но не позволили решить мою проблему.
Настроить:
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: Невозможно получить доступ к памяти по адресу 0xffffffffffffffe8Traceback (последний вызов был последним):
Файл «/usr/lib64/../share/gdb/python/libstdcxx/v6/printers.py», строка 558, в to_string
вернуть self.val [‘_ M_dataplus’] [‘_ M_p’]. lazy_string (length = len)
RuntimeError: Невозможно получить доступ к памяти по адресу 0xffffffffffffffe8Traceback (последний вызов был последним):
Файл «/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, даже отключив симпатичную печать, но это все же происходит. Я не знаю, что еще попробовать дальше.
Я отправил тикет в Eclipse (Красивые ошибки печати делают невозможным отладку Eclipse) и ответ от Marc Dumais указывает, что эта ошибка является результатом дефекта в GDB. До тех пор, пока GDB не будет исправлен, единственный способ обойти эту ошибку, используя красивую печать в Eclipse (согласно предложению Марка), — это скрыть все активные переменные окна / вкладки. Это не позволяет Eclipse запрашивать у GDB начальные значения для переменных, которые еще не могут быть инициализированы.
Устранение этой проблемы просто с помощью вкладки «Переменные» в перспективе «Отладка». Это решение может зависеть от кода в этом коде, и многие неинициализированные переменные все еще могут быть трудны для отладки.
Я, наконец, решил вернуться к этой проблеме и, наконец, решил ее, следуя решениям, аналогичным этот, и путем дополнительного редактирования моих пользовательских printers.py. Надеюсь, это поможет кому-то еще, кто ударил это.
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
) чтобы $HOME/gdb/gdb_printers/
,
/usr/share/gdb/
).Эта структура должна быть ТОЧНОЙ, иначе она не будет использовать ваш printers.py в / v6 /.
Отредактируйте 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)
Создание / редактирование $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
В Затмении, под Window -> preferences -> C/C++ -> Debug -> GDB
установите путь к gdb
и ваш .gdbinit
файл. Вы также может необходимо установить это в любых существующих конфигурациях отладки, которые вы хотите использовать в вашем printers.py.
GDB debugger: /usr/bin/gdb
GDB command file: /home/(user_id)/gdb/.gdbinit
Оттуда, функции отладки, как вы думаете, должны.