[英]Inspecting standard container (std::map) contents with gdb
假設有這樣的事情:
#include <map>
int main(){
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0;
}
我希望能夠檢查從gdb運行該程序的地圖的內容。
如果我嘗試使用下標運算符,則會得到:
(gdb) p m[1]
Attempt to take address of value not located in memory.
使用find方法不會產生更好的結果:
(gdb) p m.find(1)
Cannot evaluate function -- may be inlined
有沒有辦法做到這一點?
我認為沒有,至少沒有,如果您的源代碼經過優化等。但是,有一些gdb宏可以為您檢查STL容器:
http://sourceware.org/ml/gdb/2008-02/msg00064.html
但是,我不使用它,所以YMMV
總有一個明顯的發現:定義自己的測試功能...從gdb調用它。 例如:
#define SHOW(X) cout << # X " = " << (X) << endl
void testPrint( map<int,int> & m, int i )
{
SHOW( m[i] );
SHOW( m.find(i)->first );
}
int
main()
{
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0; // Line 15.
}
和:
....
Breakpoint 1 at 0x400e08: file foo.C, line 15.
(gdb) run
Starting program: /tmp/z/qD
Breakpoint 1, main () at qD.C:15
(gdb) call testPrint( m, 2)
m[i] = 4
(*m.find(i)).first = 2
(gdb)
stl-views.gdb
曾經是最好的答案,但現在已經不存在了。
這還沒有集成到主線GDB
,但是這是使用'archer-tromey-python' 分支得到的 :
(gdb) list
1 #include <map>
2 int main(){
3 std::map<int,int> m;
4 m[1] = 2;
5 m[2] = 4;
6 return 0;
7 }
(gdb) break 6
Breakpoint 1 at 0x8048274: file map.cc, line 6.
(gdb) run
Breakpoint 1, main () at map.cc:6
6 return 0;
(gdb) print m
$1 = std::map with 2 elements = {
[1] = 2,
[2] = 4
}
(gdb) quit
嘗試取消引用STL容器:在此頁面上: http : //www.yolinux.com/TUTORIALS/GDB-Commands.html
上面的答案是行之有效的。 如果您使用的是stl-views.gdb,這是查看其中的地圖和元素的正確方法。 讓您的地圖如下: std::map<char, int> myMap;
(gdb) pmap myMap char int
即pmap <variable_name> <left_element_type> <right_element_type>
以查看地圖中的元素。
希望能有所幫助。
您可以通過確保編譯器在編譯程序時使用DWARF-2(或3或4)調試信息來解決第二個問題( Cannot evaluate function -- may be inlined
)。 DWARF-2包含內聯信息,因此您應該能夠使用所描述的任何一種方法來訪問std::map
容器的元素。
要使用DWARF-2調試信息進行編譯,請將-gdwarf-2
標志添加到您的compile命令中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.