2013-07-23 78 views
18

繼升壓shared_ptr的是我的源代碼:檢查使用gdb

#include <iostream> 
#include <boost/shared_ptr.hpp> 

class MyClass 
{ 
    public: 
     MyClass() 
     { 
      i=10; 
     } 
    private: 
     int i; 
}; 


int main(int argc, const char *argv[]) 
{ 
    boost::shared_ptr <MyClass> obj(new MyClass()); 
    return 0; 
} 

我要檢查在gdb OBJ,並查看成員變量i的值。

這是我得到正常的打印:

29   boost::shared_ptr <MyClass> obj(new MyClass()); 
(gdb) n 
30   return 0; 
(gdb) p obj 
$1 = {px = 0x602010, pn = {pi_ = 0x602030}} 

我試着在this link提到的提示,但不起作用。

(gdb) call (obj.get())->print() 
Cannot evaluate function -- may be inlined 

有沒有其他辦法? gdb版本是7.0.1。

+0

另一個很好的老朋友是普通的printf: ) –

+1

@ Anand Rathi ...,是的,但我只是想知道這是否可以用gdb。 –

回答

28

明白了!

(gdb) set print pretty 
(gdb) p obj 
$5 = { 
    px = 0x602010, 
    pn = { 
    pi_ = 0x602030 
    } 
} 
(gdb) p obj.px 
$6 = (MyClass *) 0x602010 



(gdb) p *(obj.px) 
$7 = { 
    i = 10 
} 
+3

這是我見過的最有用的東西!萬分感謝。我沒有意識到我可以通過這種方式去指引指針。 :-) – kmort

+3

這不適合我。 「p obj」給出了'$ 2 = std :: shared_ptr(count 2,weak 1)0x639268',並且「p obj.px」給出了'沒有名爲px'的成員或方法。我也嘗試過「p * obj」,但沒有快樂:'找不到運算符* .' –

0

這將是一個難以回答的問題。 GDB 7.x增加了Python腳本支持。網絡上有一些資源。而不是讓一個貧窮的嘗試建議的東西我沒有第一次的經驗中,我將把你過去後:

C++ GDB Python Pretty Printing Tutorial?

0

當編譯使用-ggdb選項,看看是否能工程

http://sourceware.org/gdb/onlinedocs/gdb/Inline-Functions.html

內聯是直接在每個調用位置的插入代替跳躍到一個共享例程函數體的一個副本,一個優化。 gdb像非內聯函數一樣顯示內聯函數。他們出現在回溯中。你可以查看他們的參數和局部變量,一步步進入它們,在下一步跳過它們,並在完成時退出它們。您可以使用info frame命令檢查函數是否內聯。

爲了gdb支持內聯函數,編譯器必須在調試信息中記錄關於內聯的信息 - 使用dwarf 2格式的gcc執行此操作,其他幾個編譯器也這樣做。 gdb在使用矮人時只支持內聯函數2. 4.1之前版本的gcc不會發出兩個必需的屬性('DW_AT_call_file'和'DW_AT_call_line'); gdb不會顯示帶有早期版本的gcc的內聯函數調用。它將調用者中的內聯函數的參數和局部變量顯示爲局部變量。

內聯函數的主體直接包含在其調用站點;與非內聯函數不同,沒有專門用於該調用的指令。 gdb仍然假裝調用站點和內聯函數的開始是不同的指令。進入呼叫站點顯示呼叫站點,然後重新步進顯示內聯函數的第一行,即使沒有執行附加指令。

這使得源代碼級別的調試更加清晰;您可以看到通話的上下文以及通話的效果。只使用stepi或nexti通過單個指令進行跳轉不會執行此操作;單指令步驟始終顯示內聯主體。

有一些GDB不假裝,內聯函數調用是一樣的普通電話的一些方法:

在聯函數可能無法正常工作的調用點設置斷點,因爲呼叫站點不包含任何碼。在調用之後,gdb可能會錯誤地將斷點移動到封閉函數的下一行。這個限制將在未來版本的gdb中被刪除;在此之前,請在更早的行或者內聯函數中設置一個斷點。 使用完成命令後,gdb找不到內聯調用的返回值。這是編譯器生成的調試信息的限制;完成後,您可以進入下一行並在您的程序存儲返回值時打印一個變量。

2

試試這個:

打印(* obj.px)i將

完整的代碼如下:

(gdb) list 1,23 
1  #include <iostream> 
2  #include <boost/shared_ptr.hpp> 
3  #include <string> 
4 
5  class MyClass 
6  { 
7   public: 
8    MyClass() 
9     : name("Testing") 
10    { 
11     i=10; 
12    } 
13   private: 
14    int i; 
15    std::string name; 
16  }; 
17 
18 
19  int main(int argc, const char *argv[]) 
20  { 
21   boost::shared_ptr <MyClass> obj(new MyClass()); 
22   return 0; 
23  } 
(gdb) p obj 
$9 = {px = 0x602010, pn = {pi_ = 0x602060}} 
(gdb) p (*obj.px).i 
$10 = 10 
(gdb) p (*obj.px).name 
$11 = {static npos = 18446744073709551615, 
    _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, 
    _M_p = 0x602048 "Testing"}}