std::unique_ptr
sind nett, aber ich finde sie weniger bequem beim Debuggen in DDD oder gdb.Wie Debuggen von C++ 11-Code mit Unique_ptr in DDD (oder Gdb)?
Ich verwende die gdb hübschen Drucker, die Teil von gcc sind (z. B. /usr/share/gcc-4.8.2/python/libstdcxx/v6/printers.py
). Das ist ein großer Gewinn für die Lesbarkeit, zum Beispiel:
$ print pTest
std::unique_ptr<MyType> containing 0x2cef0a0
jedoch nicht den Zeiger Dereferenzierung nicht:
$ print *pTest
Could not find operator*.
Wenn ich den Wert zugreifen müssen, muss ich manuell den Zeiger kopieren und warf es auf den richtigen Typ, zum Beispiel:
print *((MyType*) 0x2cef0a0)
Wenn der Prozess noch läuft, ist diese Version funktioniert (noch hässlich, aber besser):
print *pTest.get() // will not work if analyzing a core dump
Der direkte Ansatz zu Display *pTest
in DDD funktioniert auch nicht. Es ergibt sich nur in dem folgenden Fehler:
<error: Could not find operator*.>
Gibt es eine Möglichkeit C++ 11-Code mit unique_ptr in DDD debuggen (ohne den Workflow zu brechen, wie ich mit meiner umständlichen Behelfslösungen tun)?
Ich habe keine Angst, Gdb-Befehle zu verwenden, aber DDD-Integration wäre ein Pluspunkt. Zum Beispiel ist das Verfolgen von Zeigern in Datenstrukturen durch einfaches Doppelklicken doppelt schneller als Tippen.
Ich habe schon versucht, den hübschen Drucker fallen zu lassen, aber es ist auch nicht optimal. Das Beste, was ich tun konnte, ist die folgende:
print pTest._M_t->_M_head_impl
wie eine dumme Frage klingen, aber haben Sie die bauen müssen GCC-Compiler auf Ihrer Box von Grund auf neu? Oder war es ein RPM-Update? Ich hatte kürzlich ein Problem mit gdb, als ich versuchte, etwas C++ 11-Code zu debuggen, und fand heraus, dass ich gdb nicht neu kompiliert hatte. Ich bin mir ziemlich sicher, dass das hier nicht der Fall ist, aber ich dachte, dass es sich lohnt, danach zu fragen. – Welshboy
@Welshboy Ich verwende derzeit die offizielle gcc 4.8.2 (20140206) und gdb 7.7 von Arch Linux. –
Sie könnten dies versuchen: http://stackoverflow.com/questions/322322/displaying-dereferenced-stl-iterators-in-gdb und insbesondere eine gdbinit-Datei ansehen. Es sieht so aus, als gäbe es viele benutzerdefinierte Dinge, die gdb machen kann. Viel Glück. – Ben