簡體   English   中英

GDB和C ++:打印指向對象的指針

[英]GDB & C++: Printing vector of pointers to objects

在我的代碼中,我有一個STL向量,它包含指向對象的指針。 我這樣編碼的原因是因為我必須從不同的地方操縱對象本身。

std::vector<Object*> objects;

for (int i = 0; i < 10; i++) {
    Object* o = new Object(i);
    objects.push_back(o);
}

此代碼假設Object是一個接受整數作為構造函數參數的對象。 假設在for循環結束后我使用GDB斷點,為了輕松查看向量中的對象,我需要做些什么?

當我執行“p對象”時,它只列出完全預期的指針地址,但我想看到每個對象也保存的整數變量。 我試過“p objects [0]”,但這會返回“找不到運算符[]”。

有人遇到過這個問題嗎? 或者知道如何解決這個問題? 我的目標是能夠在這些對象的指針存儲在STL向量中時查看GDB實際擁有的對象。

這肯定是實現定義的,但對於GCC,您可以這樣做:

print **(v._M_impl._M_start)@1

其中v表示向量, 1表示索引。 您需要取消引用兩次才能獲得該值。

struct Object
{
    int n;
    Object(int n)
        : n(n) { }
};

int main()
{
    std::vector<Object*> v;
    v.push_back(new Object{42});
    v.size(); // where we breakpoint
    // release our memory at some point
}

我們的測試運行:

(gdb) break 16
Breakpoint 1 at 0x400aae: file test.cpp, line 16.
(gdb) run
Starting program: a.out 

Breakpoint 1, main () at test.cpp:16
16      v.size(); // where we breakpoint
(gdb) print v
$1 = {<std::_Vector_base<Object*, std::allocator<Object*> >> = {
    _M_impl = {<std::allocator<Object*>> = {<__gnu_cxx::new_allocator<Object*>> = {<No data fields>}, <No data fields>}, _M_start = 0x604030, _M_finish = 0x604038, _M_end_of_storage = 0x604038}}, <No data fields>}
(gdb) print **(v._M_impl._M_start)@1
$2 = {{n = 42}}

這是一個一個接一個地打印值的函數:

define pv
  set $pvPOS_ = 0
  while $arg0._M_impl._M_start + $pvPOS_ != $arg0._M_impl._M_finish 
    print **($arg0._M_impl._M_start + $pvPOS_)
    set $pvPOS_ = $pvPOS_ + 1
  end
end

用作pv my_vec

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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