2012-12-07 76 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'断点将碰到的第一个时间程序进入条件块。 –