2016-03-04 44 views
7

我在我的C++程序中使用GDB時遇到問題。我想爲我的類成員函數設置一個斷點,我不確定如何執行它的語法。我的程序現在正在運行,我只是想學習使用GDB。我的問題是我在線上找到的所有信息只能處理main()文件,沒有其他函數或類,如果它們涉及類,它只能使用帶有void return語句的函數。成員函數的C++ GDB斷點

我有一個二叉搜索樹類。我想在程序中的一個函數中設置一個斷點。 這是我的頭文件的部分。

class BST 
{ 
    BST() 
    ... 
    private: 
    int add((BST * root, BST *src); 
} 

我正在telnet到一個命令行linux服務器的學校。 我可以使用g ++ -g * .cpp(還有其他文件可以正常工作)使用我的程序運行GDB,並將文件保存爲a.out。 我運行GDB與

gdb ./a.out 

我進入GDB。我可以得到虛空顯示功能只是

b BST::disp_block() 

細破發點,但我怎麼用add函數我試圖

b BST::int add(BST*, BST *) 
b int BST::add(BST*, BST *) 
b BST::add(BST*, BST *) 

,我甚至與參數名

試圖做到這一點
b BST::int add(BST * root, BST * src) 
b int BST::add(BST * root, BST * src) 
b BST::add(BST * root, BST * src) 

,我不斷收到錯誤

Function "____" not defined. 
Make break point pending on future shared library load? (y or [n]) 

如何爲這個成員函數設置一箇中斷點?我假設觀察點將是相同的格式,如果不是,你是否也可以解釋。

+2

在沒有重載的情況下,或者如果你想在所有的重載中斷開,'b BST :: add'。不需要論證。請注意,如果您的類位於命名空間中,則還需要包含命名空間。 –

+1

也可以通過文件名:linenumber在gdb中設置斷點。如果你的函數在bst.c中,在第25行,命令是: (gdb)bst.c:25 – JGroven

回答

6

正如黑暗獵鷹所言,break BST::add應該工作,如果你沒有超載。

您也可以鍵入:

(gdb) break 'BST::add(<TAB> 

(注意單引號)。這應該促使GDB進行製表完成,並完成第一行:

(gdb) break 'BST::add(BST*, BST*) 

和點你可以添加終止'「,然後按Enter鍵添加斷點。

我可以得到虛空顯示功能

函數的返回類型不是其簽名的組成部分,具有沒有做什麼發生一個破發點。

+3

另一個值得了解的技巧是使用'info func'和regexp參數來找到gdb認爲a函數可能會被命名。 –

2

您可能需要指定名稱空間(如果爲該類定義的話)。如果它不是標準命名空間標準。如果您正在執行正確的二進制文件,則文件名是可選的。您可以驗證可執行文件中是否存在符號。 「nm -C」命令,其中-C處理C++的名稱修改。如果命名空間是「mySpace」,並且類是「X」,其成員是「Y」,那麼斷點應如下所示:「(gdb)b mySpace :: X :: Y「