2012-12-07 75 views
0

這一個讓我吃驚,自動完成設置斷點,似乎兩個選項同樣的方法做時。有什麼好處,爲什麼GDB從方法名和方法名::不同<static var>

test::TestFoo::SendFoo(short) 
test::TestFoo::SendFoo(short)::fooID 

CPP的:

bool TestFoo::SendFoo(short x) 
{ 
    ... 
    static unsigned int fooID = 0; 

爲什麼GDB不同?使用這個或另一個有什麼好處?

問題標記爲C++,以避免由C靜態任何missunderstanding。

gdb --version 
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6) 
... 

回答

2

SendFoo::fooIDSendFoo是兩種不同的符號,我可以想像會有兩個斷點差異GDB提供你 - 雖然我不是很熟悉的話:

所在行fooID定義/初始化將在整個程序中只打一次,所以該行斷點應該只命中了一次爲好。每次函數被調用時都應該調用函數級斷點,所以有一個主要區別。

AFAIK功能範圍static裝置,用於C和C++相同的 - 即該函數的所有呼叫之間共享,且首次初始化功能被調用的變量。

+0

我不能右擊現在測試,但會在3調用SendFoo,會發生以下情況: SendFoo :: fooID SendFoo SendFoo 所以用b SendFoo我會趕上只有第二和第三,或3作爲一個通用形式。 –

+1

你應該得到每* *與功能級斷點,不僅第二和第三調用。其中斷點被擊中的順序應該是'SendFoo' - 'SendFoo :: fooId' - 'SendFoo' - 'SendFoo'。這假設'fooId'在功能範圍是靜態的,而不是例如。裏面的一些條件塊內的功能。在這種情況下,'fooId'斷點將碰到的第一個時間程序進入條件塊。 –