2008-09-27 104 views
10

Windbg風扇聲稱它非常強大,我傾向於同意。但是當涉及到調試STL容器時,我總是被卡住。如果變量位於堆棧上,!stl擴展有時會將其解析出來,但是當具有複雜類型的容器(例如std::vector<TemplateField, std::allocator<TemplateField> >)位於堆或其他某個結構的一部分上時,我只是不知道如何查看其內容。在Windbg中調試C++ STL容器

欣賞任何提示,指針。

回答

2

您可能還需要試試這個debugger extension。它是一個名爲SDbgExt的庫,由Skywing開發。

+1

此擴展名似乎只適用於VC7.0 ... – 2009-08-17 11:05:21

3

我經常發現調試器對STL數據類型的支持不足。出於這個原因,我越來越多地使用logging frameworks and logging statements。我曾經認爲這些適用於不能使用調試器的人,但我現在意識到他們提供了真正的價值。它們允許您在代碼中嵌入便攜式調試知識並將其與代碼一起保存。相反,你在調試器中做的工作通常是短暫的。

0

我通常最終堅持在我的很多課程中使用toString()方法。這說明一切,我認爲重要的信息,任何容器就可以調用這個控制檯顯示類信息

0

使用DT -r 即DT yourapp!類7ffdf000 -r5

1

前段時間我有同樣的問題。我的答案是Visual Studio對STL和複雜類型來說是一個更好的調試器(就像Visual Studio只是一個比MDbg更好的調試器)。

這並不是說WinDBG不夠強大,只是它的較低級別(例如,嘗試使用Visual Studio做一些有用的崩潰轉儲 - 你不能)。

總之,要回答你的問題,你可以使用Visual Studio來看看使用一些技巧的數據類型:

  1. 啓動的WinDbg另一個實例,重視非侵入性:cdb -p <PID> -pv。這將暫停墮胎者的線索。現在您可以安全地分離原始WinDBG qd
  2. 將Visual Studio附加到它,然後分離非侵入性WinDBG qd。看看STL並按照你的意願繼續。
  3. 當您需要返回到WinDBG時,轉到步驟1,與侵入的WinDBG交換。