std::unique_ptr
хороши, но я считаю их менее удобными при отладке в DDD или gdb.Как отлаживать код C++ 11 с unique_ptr в DDD (или gdb)?
Я использую красивые принтеры gdb, которые являются частью gcc (например, /usr/share/gcc-4.8.2/python/libstdcxx/v6/printers.py
). Это большая победа для читаемости, например:
$ print pTest
std::unique_ptr<MyType> containing 0x2cef0a0
Однако разыменования указателя не работает:
$ print *pTest
Could not find operator*.
Когда мне нужно получить доступ к значению, я должен вручную скопировать указатель и привести его к правильному типу, например:
print *((MyType*) 0x2cef0a0)
Если процесс все еще работает, эта версия работает (еще некрасиво, но лучше):
print *pTest.get() // will not work if analyzing a core dump
Простой подход к Display *pTest
в DDD также не работает. Это приводит только к следующей ошибке:
<error: Could not find operator*.>
Есть ли способ отладки C++ 11 кода с unique_ptr в DDD (без нарушения рабочего процесса, как я делаю со своим громоздкими обходными)?
Я не боюсь использовать команды gdb, но интеграция с DDD будет плюсом. Например, следующие указатели в структурах данных путем двойного щелчка по ним часто бывают быстрее, чем ввод.
Я уже пытался сбросить красивый принтер, но он также не оптимален. Самое лучшее, что я мог придумать следующий:
print pTest._M_t->_M_head_impl
может звучать как немой вопрос, но вы должны построить gcc на вашем ящике с нуля? Или это обновление RPM? Недавно у меня возникла проблема с gdb при попытке отладки кода C++ 11, и я обнаружил, что не перекомпилировал gdb. Я почти уверен, что здесь дело не в этом, но я подумал, что это может стоить того. – Welshboy
@Welshboy В настоящее время я использую официальный gcc 4.8.2 (20140206) и gdb 7.7 из Arch Linux. –
Вы можете попробовать следующее: http://stackoverflow.com/questions/322322/displaying-dereferenced-stl-iterators-in-gdb и, в частности, посмотреть файл gdbinit. Похоже, есть много особых вещей, которые вы можете сделать gdb. Удачи. – Ben