Nie pracowałem jeszcze nad współdzielonymi wskaźnikami. Po prostu znam tę koncepcję. Próbuję debugować funkcje w następującej klasie C++, która przechowuje dane pliku XML (wczytanie za pośrednictwem biblioteki xerces).W gdb mogę wywoływać niektóre funkcje klasowe, ale inne "nie można rozwiązać". Czemu?
// 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_;
}
Teraz jeśli mam debugowania kawałek kodu, w którym mam instancję wskaźnik do klasy ParamNode
, i to się nazywa 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
Korzystanie gdb
mam inspekcji paramNode_
obiekt:
(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, }
i wydrukować jego członkowie:
(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);
Mogę jednak tylko wywoływać funkcje HasChildren
lub GetChildren
, natomiast wywołanie Get
z gdb
wyniki w błąd:
(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.
W kodzie wykonywania funkcji Get("domain")
działa dobrze. Dlaczego? Jestem wdzięczny, jeśli uwzględnisz wyjaśnienia w swojej odpowiedzi, ze względu na moją ograniczoną znajomość współdzielonych wskaźników.
Może to nie ma nic wspólnego z 'shared_ptr'. Może 'gdb' po prostu nie może przekonwertować' "domain" '(' const char [7] ', może niejawnie zepsuć do' const char * ') do' const std :: string & '(przez skonstruowanie tymczasowego' std :: string ') w czasie wykonywania. Nie mam 'gdb' pod ręką, ale proponuję spróbować z bardzo prostym kodem jak' std :: size_t f (const std :: string & s) {return s.length(); } ', następnie w gdb' p f ("cześć") 'i może' p f (std :: string ("hello"))), aby sprawdzić, czy nadal pojawia się błąd. –
dobry pomysł. Właśnie próbowałem tego. Funkcja 'f' działa w kodzie, jednak' (gdb) pf ("cześć") Próba pobrania adresu wartości, która nie znajduje się w pamięci. '(Gdb) ustawiono przeciążenie-rozdzielczość na (gdb) pf (" hsdflo ") Nie można rozwiązać funkcji f z żadnym przeciążonym wystąpieniem. Użycie 'std: string' w gdb spowodowało błąd składniowy ... – Sebastian