簡體   English   中英

使用gdb檢查標准容器(std :: map)內容

[英]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

有沒有辦法做到這一點?

現有的這個問題的答案是非常不合時宜的。 借助最新的GCC和GDB,Just Works TM得益於GDB 7.x中內置的Python支持以及GCC隨附的libstdc ++漂亮打印機。

對於OP的示例,我得到:

(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}

如果它不能自動運行,請參閱GDB Wiki的STL支持頁面上的第一個項目符號。

您也可以為自己的類型編寫Python漂亮打印機,請參閱GDB手冊中的漂亮打印

我認為沒有,至少沒有,如果您的源代碼經過優化等。但是,有一些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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM