我想檢查GDB中的std::vector
的內容,我該如何做?爲了簡單起見,假設它是一個std::vector<int>
。如何在GDB中打印C++向量的元素?
回答
編譯要查看矢量的std ::矢量myVector內容,只是在類型GDB:
(gdb) print myVector
這將產生類似的輸出:
$1 = std::vector of length 3, capacity 4 = {10, 20, 30}
爲了達到上述目的,你需要有gdb 7(我在gdb 7.01上測試過)和一些python漂亮的打印機。這些的安裝過程在gdb wiki上描述。
更重要的是,上述安裝後,這與Eclipse的 C++調試器GUI效果很好(使用GDB任何其他的IDE,因爲我認爲)。
隨着GCC 4.1.2,打印整個一個std ::的矢量<INT>名爲myVector,執行下列操作:
print *(myVector._M_impl._M_start)@myVector.size()
要打印只有第一N個元素,如下:
print *(myVector._M_impl._M_start)@N
說明
這可能是嚴重依賴於你的編譯器版本,但對於GCC 4.1.2,指針到內部陣列是:
myVector._M_impl._M_start
而GDB命令到陣列的打印N個元件開始在指針P是:
print [email protected]
或者,在一個簡短的格式(對於一個標準的.gdbinit):
p [email protected]
呵呵,這是我之前的事情,所以我只是今天早上看它了並作爲備忘錄添加到自己(如傑夫本人推薦)。 – 2008-10-31 11:10:42
另外,如果你只想要一個特定的向量元素,myVector._M_impl._M_start + n(對於第n個元素) – mariner 2014-01-07 01:26:43
在調試時看着'STL容器是有點問題。以下是我過去使用的3種不同的解決方案,其中沒有一個是完美的。
1)使用http://clith.com/gdb_stl_utils/的GDB腳本這些腳本允許您打印幾乎所有STL容器的內容。問題在於,這對嵌套容器(如堆棧集合)不起作用。
2)Visual Studio 2005對於觀看STL容器有很棒的支持。這適用於嵌套容器,但這僅適用於STL,並且在將STL容器放入Boost容器時不起作用。
3)編寫您自己的'打印'功能(或方法),您可以在調試過程中打印特定項目,並在GDB打印項目時使用'call'。請注意,如果你的打印函數沒有在代碼中的任何地方被調用,g ++將會執行死代碼消除,並且GDB將找不到「打印」函數(你會得到一條消息說函數是內聯的)。因此,與-fkeep內聯函數
在〜/中加入以下內容。gdbinit
define print_vector
if $argc == 2
set $elem = $arg0.size()
if $arg1 >= $arg0.size()
printf "Error, %s.size() = %d, printing last element:\n", "$arg0", $arg0.size()
set $elem = $arg1 -1
end
print *($arg0._M_impl._M_start + $elem)@1
else
print *($arg0._M_impl._M_start)@$arg0.size()
end
end
document print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
end
重新啓動的gdb(或源〜/ .gdbinit)後,顯示出這樣
gdb) help print_vector
Display vector contents
Usage: print_vector VECTOR_NAME INDEX
VECTOR_NAME is the name of the vector
INDEX is an optional argument specifying the element to display
實施例的使用關聯的幫助:
(gdb) print_vector videoconfig_.entries 0
$32 = {{subChannelId = 177 '\261', sourceId = 0 '\000', hasH264PayloadInfo = false, bitrate = 0, payloadType = 68 'D', maxFs = 0, maxMbps = 0, maxFps = 134, encoder = 0 '\000', temporalLayers = 0 '\000'}}
- 1. 如何在OSX 10.9上的GDB中打印C++向量的元素?
- 2. gdb中的打印結構元素
- 3. 如何在GDB中打印#defined常量?
- 4. GDB&C++:打印對象指針的向量
- 5. 如何打印成對向量數組的元素?
- 6. 如何打印元素數量
- 7. 如何在gdb中打印Java數組?
- 8. 如何在gdb中打印wstring
- 9. 如何在gdb中打印-0x4(%rbp)?
- 10. 如何在gdb中打印std :: map值
- 11. 如何在GDB中打印Fortran數組?
- 12. 在GDB中如何打印0xc(%rsp)?
- 13. golang gdb - 打印變量
- 14. 使用GDB打印C++ vtables
- 15. 如何更新打印機的C++向量,以便它可以打印每個元素
- 16. Gdb,如何使用打印?
- 17. 如何在C++中打印出嵌套向量的內容?
- 18. 打印列表中的元素C
- 19. 在ArrayList中打印元素
- 20. C++中的元組向量元素
- 21. 如何在gdb中打印<incomplete type>變量
- 22. 如何在Objective-C中打印單個數組元素?
- 23. 向量元素ID的C++
- 24. 打印C中所有列表元素
- 25. 如何在gdb的特定條件下打印變量?
- 26. 向量在c + +打印重複輸入
- 27. 如何解析和打印從目標C中的xml元素獲取元素?
- 28. C#2D數組 - 如何打印每行中最大的元素
- 29. R打印矢量的一個元素
- 30. 在Java中向量中打印出某些索引處的元素
類似的問題:HTTP://計算器.com/questions/427589/inspecting-standard-container-stdmap-contents-with-gdb(答案中的鏈接非常有趣)。 – 2009-06-26 15:47:49
新的,更好的方法是在這個問題中:http://stackoverflow.com/questions/2492020/how-to-view-contents-of-stl-containers-using-gdb-7-x/2492341# 2492341 – dshepherd 2013-04-19 11:19:09
非矢量特定:https://stackoverflow.com/questions/427589/inspecting-standard-container-stdmap-contents-with-gdb – 2017-09-24 10:29:36