mongodbではcursorクラスを「Cursor:boost::noncopyable」と定義しており、そこから派生したクラスがたくさんあります。クライアントからの特定の操作で、どの XXXCursor が使用されたかを知りたいです。Cursor::Cursor にブレークポイントを設定したいと思います。しかし失敗しました。
(gdb) b mongo::Cursor::Cursor
the class mongo::Cursor does not have any method named Cursor
Hint: try 'mongo::Cursor::Cursor<TAB> or 'mongo::Cursor::Cursor<ESC-?>
(Note leading single quote.)
Make breakpoint pending on future shared library load? (y or [n]) n
(gdb) ptype mongo::Cursor
type = class mongo::Cursor : private boost::noncopyable_::noncopyable {
public:
~Cursor(int);
virtual bool ok(void);
bool eof(void);
virtual mongo::Record * _current(void);
virtual mongo::BSONObj current(void);
virtual mongo::DiskLoc currLoc(void);
virtual bool advance(void);
virtual mongo::BSONObj currKey(void) const;
....
}
(gdb) list mongo::Cursor::Cursor
**the class mongo::Cursor does not have any method named Cursor
Hint: try 'mongo::Cursor::Cursor<TAB> or 'mongo::Cursor::Cursor<ESC-?>**
(Note leading single quote.)
しかし、私は同様のプログラムを書きました
#include <iostream>
#include <boost/utility.hpp>
class Base : boost::noncopyable {
public:
void printx() {std::cout<< getx() <<"\n" ;}
virtual int getx()=0;
};
class P : public Base {
public:
int x;
virtual int getx() { return x*3;}
P(int c){ x= c;}
};
int main(){
P p(2);
p.printx();
return 0;
}
Base::Base にブレークポイントを設定できました。
mongo::Cursor::Cursor にブレークポイントを設定できない理由がわかりましたか?
mongo::Cursor はここで定義されました: https://github.com/mongodb/mongo/blob/master/src/mongo/db/cursor.h