2015-04-19 16 views
6

Ich versuche, eine Klasse zu debuggen, die stark auf Vererbung angewiesen ist. Eine Debugsitzung ist mühsam, weil ein Objekt dieselbe Funktion für ein anderes Objekt in einer Kette aufruft. Ich verschwende viel Zeit damit, irrelevanten Code zu verwenden, der anderswo besser ausgegeben werden könnte.Haltepunkt mit Platzhaltern setzen?

Hier ist der einfache: Ich möchte einen Haltepunkt auf einer Klasseninstanz mit einem Platzhalter wie b Foo::* setzen. Auf diese Weise wird der Debugger einrasten, wenn der Inhalt, an dem ich interessiert bin, den Bereich eingibt (wie eine statische Funktion oder eine Elementfunktion).

Hier ist der harte: eine parametrisierte Klasse: Ich möchte einen Haltepunkt auf Mitglied-Funktion einer Template-Klasse mit einem Platzhalter wie b Foo<*>::bar setzen. (Das eigentliche Problem ist viel schlimmer als das, weil die Template-Parameter selbst Template-Klassen sind).

Obwohl GDB scheint mich eine setzen, stoppt der Debugger nicht (siehe unten). Es beansprucht, dass es einen Haltepunkt für zukünftige Lasten setzt. Tatsächlich habe ich statische Verknüpfungen verwendet und die Symbole sind bereits vorhanden. Es werden keine Bibliotheken geladen.

Wie setze ich einen Haltepunkt mit Platzhaltern?


(gdb) b CryptoPP::PK_EncryptorFilter::* 
Function "CryptoPP::PK_EncryptorFilter::*" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 

Breakpoint 2 (CryptoPP::PK_EncryptorFilter::*) pending. 
(gdb) r 
Starting program: /home/cryptopp-ecies/ecies-test.exe 
Attack at dawn! 
[Inferior 1 (process 5163) exited normally] 

Und:

(gdb) rbreak CryptoPP::DL_EncryptionAlgorithm_Xor<*>::SymmetricEncrypt 
(gdb) r 
Starting program: /home/cryptopp-ecies/ecies-test.exe 
Attack at dawn! 
[Inferior 1 (process 5470) exited normally] 
... 

(gdb) rbreak CryptoPP::*::SymmetricEncrypt 
(gdb) r 
Starting program: /home/cryptopp-ecies/ecies-test.exe 
Attack at dawn! 
[Inferior 1 (process 5487) exited normally] 

Antwort

7

Sie könnten in einer Syntax RBREAK:

(gdb) rbreak ^CryptoPP::PK_EncryptorFilter::.* 

Siehe gdb Mann: https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html

Edit:

Ich habe einige Untersuchung und erstellt main.cc wie folgt:

#include <cstdio> 

template <class OnlyOne> class MyTemplate { 
public: 
    OnlyOne oo; 
    void myfunc(){ 
     printf("debug\n"); 
    } 
}; 


int main() { 
    MyTemplate<int> mt; 
    mt.myfunc(); 
    return 0; 
} 

Dann in GDB:

(gdb) rbreak MyTemplate<.*>::myfunc 
Breakpoint 1 at 0x40055e: file main.cc, line 7. 
void MyTemplate<int>::myfunc(); 
(gdb) r 

Debuger hat kein Problem mit den Punkten zu finden, zu brechen ... Sie müssen versuchen, .* anstelle des normalen Platzhalterzeichens.

+0

Danke. Keine Freude auf der harten (C++ und Vorlagen). Ich habe die Frage aktualisiert, um das Ergebnis einzubeziehen. – jww

+0

sind Sie sicher, dass Sie den Punkt nicht vergessen haben: 'CryptoPP :: DL_EncryptionAlgorithm_Xor <.*> :: SymmetricEncrypt' –

+0

Ja, ich habe den Punkt nicht benutzt. Die Manpages sagten, der Punkt sei bereits vorhanden. Danke, das hat es gelöst. – jww