2016-11-22 3 views
0

Ich habe ein Systemtap-Skript geschrieben, um ein C++ - Programm zu profilieren. Im Systemtap-Skript möchte ich ein Klassenmitglied extrahieren. Hiersystemtap Benutzer Zeichenfolge kopieren Fehler

ist die C++ Klassendefinition:

class CFldOrder 
{ 
public: 
    ByteArray cust_no; 
}; 

class ByteArray 
{ 
public: 
    const char* get_value(){return buf;} 
private: 
    char* buf[255]; 
}; 

Hier ist der Code-Schnipsel des systemtap Skript:

probe process("/trade/ans_bu").statement("*@entrust.cpp:6614") 
{ 
    g_custno = @cast(FldOrder, "CFldOrder")->cust_no->buf 
} 

Wenn das Skript ausgeführt wird, ist es bei dieser Sonde ausgefallen ist und die „user Fehler beim Kopieren der Zeichenfolge bei Adresse 0x0000075 ". Ich denke es bedeutet "@cast (FldOrder," CFldOrder ") -> cust_no-> buf" ist keine gültige Adresse.

Wenn ich dieses Programm mit gdb debuggen und an der Position "trust.cpp: 6614" brechen, wird FldOrder.cust_no.buf korrekt angezeigt.

Wie kann ich das Skript reparieren?

Antwort

0

Das Problem ist wahrscheinlich, dass Ihr Bezeichner FldOlder ist nur eine Skriptvariable, die Stap als eine ganze Zahl mit dem initialisierten Wert von Null zu interpretieren. Der Ausdruck @cast verbirgt die Zeigerarithmetik, um die 0x00000075 Adresse zu erhalten - genau das, was Sie in C++ bekommen würden, wenn Sie & ((CFldOlder*)0)->cust_no->buf drucken würden.

Um Ihr Skript zu reparieren, übergeben Sie @cast einen gültigen Zeiger. Sie haben wahrscheinlich die Kontextvariable $FldOlder gemeint. Sie benötigen möglicherweise nicht einmal die @cast (die wie C++ reinterpret_cast<> funktioniert), wenn der Typ der Variablen bereits CFldOlder* ist.