2014-04-01 244 views
9

std::unique_ptr很好,但我發現他們在DDDgdb調試時不太舒服。如何在DDD(或gdb)中用unique_ptr調試C++ 11代碼?

我使用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 

DDD中的Display *pTest的直接方法也不起作用。它只會導致以下錯誤:

<error: Could not find operator*.> 

有沒有辦法來調試C++代碼11與DDD的unique_ptr(沒有打破就像我與我的累贅解決方法做了工作流程)?


我不害怕使用gdb命令,但DDD集成將是一個加號。例如,通過雙擊數據結構中的指針往往比鍵入更快。

我已經嘗試刪除漂亮的打印機,但它也不是最佳的。我能想出的最好的是以下幾點:

print pTest._M_t->_M_head_impl 
+0

可能聽起來像一個愚蠢的問題,但你必須建立gcc編譯器在你的盒子上從頭開始?或者它是一個RPM更新?我最近在嘗試調試一些C++ 11代碼時遇到了gdb問題,並發現我不會重新編譯gdb。我很確定這不是這種情況,但我認爲這可能值得提問。 – Welshboy

+0

@Welshboy我目前使用官方的gcc 4.8.2(20140206)和gdb 7。7來自Arch Linux。 –

+1

你可以試試這個:http://stackoverflow.com/questions/322322/displaying-dereferenced-stl-iterators-in-gdb,特別是看看gdbinit文件。看起來有很多自定義的東西可以讓gdb做。祝你好運。 – Ben

回答

7

這個問題實際上是不相關的C++ 11的unique_ptr或漂亮的印刷。問題是gcc不會發出std :: unique_ptr :: operator *的代碼,可以通過gdb調用它來解引用unique_ptr。如果您例如將*pTest;添加到您的代碼,那麼gdb會執行解引用。

在SO帖子How to `print`/evaluate c++ template functions in gdb中描述了類似的問題。對於auto_ptr,在https://sourceware.org/ml/archer/2012-q1/msg00003.html處描述幾乎相同的問題。如果我正確理解線程,則一種解決方法是修補漂亮的打印機,並在打印unique_ptr時打印出解除引用的指針。 gdb錯誤報告可在http://sourceware.org/bugzilla/show_bug.cgi?id=12937找到。

gdb wiki https://sourceware.org/gdb/wiki/STLSupport描述了更漂亮的打印解決方案,可以有其他解決方法。

編輯:更好的解決方案,迫使編譯器產生的代碼爲所有成員模板,包括運營商*被明確實例化類:

template class std::unique_ptr<MyType>; 
+0

我應該在哪裏定義這個顯式實例? – q0987

+0

從技術角度來看,只有一個翻譯單元(「cpp文件」)在包含「內存」標題後和「MyType」(或相應包含)聲明之後 - 請參見http://en.cppreference .COM/W/CPP /語言/ class_template#Explicit_instantiation – user1225999