如何解决为什么“ gdb”打印特定类的类方法?
上下文
我最近找到了this question,因为我正在寻找列出类中所有可用方法的方法,所以我开始尝试使用ptype
命令,使我发布了这个问题
考虑以下文件
#include <array>
#include <vector>
#include <list>
int main() {
std::array <int,1> a;
std::vector <int> v;
std::list <int> l;
return 0;
}
通过执行以下操作,我可以列出array
类中存在的所有方法
g++ -g main.cpp && \
gdb -q -batch -ex 'break 10' -ex 'run' -ex 'ptype a' ./a.out
Breakpoint 1 at 0x1179: file main.cpp,line 10.
Breakpoint 1,main () at main.cpp:10
10 return 0;
type = struct std::array<int,1> [with _Tp = int] {
std::__array_traits<_Tp,1>::_Type _M_elems;
public:
void fill(reference);
void swap(std::array<_Tp,1> &);
iterator begin(void);
iterator begin(void) const;
iterator end(void);
(... more methods ...)
但是,vector
和list
类(见下文)不会发生这种情况。
在ptype
类的实例上执行vector
g++ -g main.cpp && \
gdb -q -batch -ex 'break 10' -ex 'run' -ex 'ptype v' ./a.out
Breakpoint 1 at 0x1179: file main.cpp,main () at main.cpp:10
10 return 0;
type = std::vector<int>
在ptype
类的实例上执行list
g++ -g main.cpp && \
gdb -q -batch -ex 'break 10' -ex 'run' -ex 'ptype l' ./a.out
Breakpoint 1 at 0x1179: file main.cpp,main () at main.cpp:10
10 return 0;
type = std::list<int>
问题
为什么ptype
打印出array
类中存在的所有方法,而对vector
和list
类却不打印?
解决方法
我认为这是gdb错误。我在框上复制了std::vector
的这种行为,ptype v
不输出std::vector
成员:
(gdb) ptype v
type = std::vector<int>
另一方面,ptype/r v
会输出成员:
(gdb) ptype/r v
type = class std::vector<int,std::allocator<int> > : protected std::_Vector_base<int,std::allocator<int> > {
private:
static bool _S_nothrow_relocate(std::true_type);
static bool _S_nothrow_relocate(std::false_type);
static bool _S_use_relocate(void);
...
ptype/r
仅应以比普通ptype
更详细的原始格式显示成员,请参见documentation:
以“原始”形式显示。通常,GDB在打印类的时会替换类中定义的模板参数和typedef 成员。 / r标志将其禁用。
但是普通的ptype
不会显示任何内容。作为解决方法,您可以尝试使用ptype/r
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。