30

私はまだ共有ポインターに取り組んでいません..概念を知っているだけです。XMLファイルのデータを格納する次のc++クラスで関数をデバッグしようとしています( xercesライブラリを介して読み込みます)。

// header file
class ParamNode;
typedef boost::shared_ptr<ParamNode> PtrParamNode;

class ParamNode : public boost::enable_shared_from_this<ParamNode> {
public:
   ...
   typedef enum { DEFAULT, EX, PASS, INSERT, APPEND } ActionType;
   bool hasChildren() const;
   PtrParamNode GetChildren();
   PtrParamNode Get(const std::string&  name, ActionType = DEFAULT );
protected:
   ....
   ActionType defaultAction_;
}

ここで、クラスへのポインターのインスタンスを含むコードをデバッグしている場合、ParamNodeそれは呼び出されますparamNode_

PtrParamNode paramNode_;
// read xml file with xerces
paramNode_ = xerces->CreateParamNodeInstance();
// now, the xml data is stored in paramNode_.
std::string probGeo;
// this works in the code, but not in (gdb)!!
paramNode_->Get("domain")->GetValue("gt",probGeo);
cout << probGeo << endl; // <-- breakpoint HERE

を使用して、オブジェクトgdbを検査しています:paramNode_

(gdb) p paramNode_
$29 = {px = 0x295df70, pn = {pi_ = 0x2957ac0}}
(gdb) p *paramNode_.px
$30 = {
  <boost::enable_shared_from_this<mainclass::ParamNode>> = {weak_this_ = {px = 0x295df70, pn = {pi_ = 0x2957ac0}}}, 
  _vptr.ParamNode = 0x20d5ad0 <vtable for mainclass::ParamNode+16>, 
  ...
  name_= {...}, 
  children_ = {size_ = 6, capacity_ = 8, data_ = 0x2969798},
  defaultAction_ = mainclass::ParamNode::EX, }

そしてそのメンバーを印刷します:

(gdb) ptype *paramNode_.px
type = class mainclass::ParamNode : public boost::enable_shared_from_this<mainclass::ParamNode> {
  protected:
    ...
    mainclass::ParamNode::ActionType defaultAction_;
  public:
    bool HasChildren(void) const;
    mainclass::PtrParamNode GetChildren(void);
    mainclass::PtrParamNode Get(const std::string &, mainclass::ParamNode::ActionType);

ただし、関数HasChildrenまたはのみを呼び出すことができますが、 fromをGetChildren呼び出すとエラーが発生します。Getgdb

(gdb) p (paramNode_.px)->HasChildren()
 $7 = true
 (gdb) p (paramNode_.px)->GetChildren()
 $8 = (mainclass::ParamNodeList &) @0x295dfb8: {
   size_ = 6, 
   capacity_ = 8, 
   data_ = 0x29697a8
  }
(gdb) p (paramNode_.px)->Get("domain")
 Cannot resolve method mainclass::ParamNode::Get to any overloaded instance
(gdb) set overload-resolution off
(gdb) p (paramNode_.px)->Get("domain")
 One of the arguments you tried to pass to Get could not be converted to what the function wants.
(gdb) p (paramNode_.px)->Get("domain", (paramNode_.px).defaultAction_)
 One of the arguments you tried to pass to Get could not be converted to what the function wants.

コードでは、Get("domain")関数の実行は問題なく機能します。何故ですか?共有ポインターに関する知識が限られているため、回答に説明を含めていただければ幸いです。

4

4 に答える 4

17

そのような状況では、コマンドを実行した後に成功しました

set overload-resolution off
于 2015-05-02T13:29:53.950 に答える
12

前の回答へのいくつかの追加 -

gdb はおそらく最終的にこのような変換を行う方法を学習するでしょう。今はできません。しかし、C++ 式の解析のサポートを改善するための活発な作業があります。

gdb もデフォルトの引数を認識しません。これは部分的に gdb のバグです。また、部分的には g++ のバグであり、DWARF にそれらを出力しません。DWARF は、重要なデフォルト引数を発行する方法さえ定義していないと思います。

于 2013-05-24T20:49:23.420 に答える
5

nmの答えは素晴らしいですが、コードを編集して再コンパイルする必要がないようにするには、Creating C++ string in GDBに記載されている解決策を見てください。

そのソリューションではstd::string、ヒープ上の a にスペースを割り当て、 a を初期化してから呼び出したいstd::stringに渡す方法を示しています。functiongdb

于 2017-11-10T19:12:31.960 に答える