使用gdb,我遇到了一个奇怪的问题:有一种方法出现三次:
(gdb) b Logger::Logger
[0] cancel
[1] all
[2] Logger at src/Logger.cpp:52
[3] Logger at src/Logger.cpp:52
[4] Logger at src/Logger.cpp:52
由于所有三个实例都在Logger.cpp文件的第552行,因此可以推断出它们实际上是指相同的方法。 这是什么意思? Logger :: Logger构造函数是否意外地进入了二进制文件三次,还是这是一个gdb错误?
答案 0 :(得分:5)
最新版本的GCC(和许多其他编译器)创建了几个versions构造函数和析构函数。
GDB中存在一个错误,它忽略了在所有版本上设置断点,导致断点永远不会触发。现在,在更正了GDB错误后,您将获得多个断点。
选择all
,然后执行info break
,并注意3个断点的地址都不同,实际上是不同的功能。
答案 1 :(得分:0)
要么内联方法,因为gcc
认为它会表现得更好,或者它被用在一个以多种方式实例化的模板中。这两种路径都可能导致可执行二进制文件中出现多个版本。
答案 2 :(得分:0)
您可以使用“信息中断”并禁用,启用可能设置为同一行的断点....但是,您还应该知道,step vs. stepi(stepi将执行单个机器代码指令,而不是源代码等级,这是步骤的作用。)
你也可以通过c#继续特定的时间来传递那个断点...所以如果它是一个循环中的1个断点,正在被评估3次,你就去c 3,你将通过这个特殊循环...