为类成员函数设置断点不成功
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,不需要破解 ;) 这可能适用于 GCCasm("int $0x3");
请记住,此断点将被编译,并且仅应在您无法中断内联或其他优化代码时使用。它将导致代码更改,并可以显示/隐藏 Heisenbugs。【参考方案2】:
我猜编译器已经去掉了 const 说明符,
试试 b 'madoka::polarizable_sites::resize(size_t)'
【讨论】:
以上是关于为类成员函数设置断点不成功的主要内容,如果未能解决你的问题,请参考以下文章
C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?