0

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

4

1 に答える 1

0

あなたの例については。次のようにコンパイルすると:

g++ -O0 -g -m64 -I ./boost_1_53_0 main.cpp

ブレークポイントを設定すると、シンボルとして次のようBase::Baseに表示されます。Base::Base

>nm -C a.out | grep Base::Base
0000000000400a4e W Base::Base()

このようにコンパイルすると(最適化レベルO2で):

g++ -O2 -g -m64 -I ./boost_1_53_0 main.cpp

Base::Base がシンボルとして表示されません:

>nm -C a.out | grep Base::Base
>

また、ブレークポイントを設定できません:

(gdb) b Base::Base
the class Base does not have any method named Base
Hint: try 'Base::Base<TAB> or 'Base::Base<ESC-?>

したがって、最初のステップとして、プログラムまたは共有ライブラリにシンボルとして mongo::Cursor::Cursor があることを確認してください。最適化することができます。

于 2013-08-13T13:51:06.473 に答える