为类成员函数设置断点不成功

Posted

技术标签:

【中文标题】为类成员函数设置断点不成功【英文标题】:Set breakpoint for class member function not successful 【发布时间】:2011-07-31 21:20:31 【问题描述】:

我有一个类是这样的:

namespace madoka

class polarizable_sites

public:
void resize(const size_t dim_);
void clear(void);
;

在 gdb 中,我可以在 clear by 上设置断点

b 'madoka::polarizable_sites::clear()'

然而,对于成员函数resize,一个

b 'madoka::polarizable_sites::resize(const size_t)'

不起作用。 GDB报错:

类 madoka::polarizable_sites 没有任何名为的方法 resize(const size_t) 提示:尝试 'madoka::polarizable_sites::resize(const size_t)' 或 'madoka::polarizable_sites::resize(const size_t)' (注意前导 单引号。)

我想知道为什么函数样式是由 TAB 自动完成的。

顺便说一句:我正在使用 GDB

GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2 版权所有 (C) 2010 免费 软件基金会公司

带编译器'

g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 版权所有 (C) 2010 Free Software Foundation, Inc.

【问题讨论】:

你总是可以使用 file:linenumber. @yi_H 好吧,使用函数名会更好,因为如果我更改源代码,行号可能会改变,并且会有点难以追踪。 我知道,这只是一种解决方法 如果您启用了优化,编译器可能会自动内联该函数。尝试使用-O0 -ggdb重新编译 【参考方案1】:

可能函数是内联的。如果它是 GDB 语法中的 x86 代码,请尝试添加 __asm int 3 并遍历代码。这个技巧在调试 MSVC x86 代码时为我节省了大量时间。

【讨论】:

这是 gcc,不需要破解 ;) 这可能适用于 GCC asm("int $0x3"); 请记住,此断点将被编译,并且仅应在您无法中断内联或其他优化代码时使用。它将导致代码更改,并可以显示/隐藏 Heisenbugs。【参考方案2】:

我猜编译器已经去掉了 const 说明符,

试试 b 'madoka::polarizable_sites::resize(size_t)'

【讨论】:

以上是关于为类成员函数设置断点不成功的主要内容,如果未能解决你的问题,请参考以下文章

C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?

成员函数的 C++ GDB 断点

编译器何时为类的特殊成员提供定义?

C ++ typedef函数定义为类成员,以后用于函数指针?

swig perl 包装器没有为类成员函数生成

为啥这个 const auto 变量在 range-for 循环中为类的 const 成员函数编译?