2016-03-27 8 views
3

Ich debugge eine Anwendung mit WinDBG und die PDB-Dateien enthalten nur öffentliche Symbole, so zeigt der "k" Befehl nur die Funktionsnamen in einem Aufruf-Stack. Wie kann ich auch Parameter anzeigen?Get Parameter der öffentlichen Symbole in WinDBG

Ich habe bereits herausgefunden, dass ich verzierte Namen anzeigen kann, indem ich ".symopt- 2", , damit ich die "undname.exe" verwenden kann, die mit Visual Studio kommt, um die Parameter von einem verzierten Namen zu erhalten. Im Wesentlichen möchte ich, dass WinDBG das gleiche tut. Ist das möglich? Gibt es dafür ein Plugin?

Vielen Dank im Voraus!

(PS: Visual Studio zeigt die Parameter, so tut es dies wahrscheinlich in der Standardeinstellung)

+0

Windbg zurück Es ist nicht ein Ausgabe der Symbole, es ist eine Frage des Befehls. Verwenden Sie 'kb', um die Parameter in 32 Bit anzuzeigen. Beachten Sie, dass bei 64-Bit-Registern die Parameter übergeben werden und "kb" das nicht für Sie. –

+1

Ich möchte nicht die tatsächlichen Parameterwerte sehen, sondern die formalen Parameter (Terminologieverwechslung). Beispiel: void f (int a); .... f (5). Was "kb" mir gibt, ist der Wert 5. Was ich sehen möchte, ist, dass Funktion f einen Parameter vom Typ int nimmt. – plainoldcj

Antwort

1

Es gibt die Art der Symbole abhängt.

Öffentliche Symbole, enthalten keine Informationen über formale Parameter. Dies ist explained to great length here (Hinweis: Diese Seite ist auch in der Windbg-Hilfedatei verfügbar, suchen Sie nach "Public and Private Symbols").

Funktionen, auf der anderen Seite enthalten sind sowohl im privaten als Symbol Daten und allgemein zugängliche Symboltabelle, aber während des privaten Datensymbol enthält die Funktion Namen, Adresse, FPO Aufzeichnungen, Eingabeparameter Namen und Typen , und Ausgabetyp, die öffentliche Symboltabelle enthält nur die Funktion Name, Adresse und FPO-Datensatz.

x, ln (oder einige andere Befehle wie .fnent) sollten Sie diese Art von Informationen.

Beispiel mit Notizblock:

0:004> x notepad!RestoreFmt 
00007ff7`471251a8 notepad!RestoreFmt (<no parameter info>) 

0:004> ln notepad!RestoreFmt 
Browse module 
Set bu breakpoint 

(00007ff7`471251a8) notepad!RestoreFmt | (00007ff7`471251f8) notepad!SaveFile 
Exact matches: 
    notepad!RestoreFmt (<no parameter info>) 

Beachten Sie, dass <no parameter info> eindeutig fest, dass die Symbole enthalten nicht die erforderlichen Informationen ein.

Dasselbe zu einem anderen Programm mit einem eigenen symbolischen Informationen angewandt:

C++ Code:

bool DiskReaderWriter::ReadDisk(off_t offset, size_t size_to_read, std::vector<BYTE>& buffer) 

Windbg:

0:001> x drive_rw!DiskReaderWriter::ReadDisk 
00000000`00d202c0 drive_rw!DiskReaderWriter::ReadDisk (long, unsigned int, class std::vector<unsigned char,std::allocator<unsigned char> > *) 

0:001> ln drive_rw!DiskReaderWriter::ReadDisk 
Browse module 
Set bu breakpoint 

g:\app\cpp\drive_rw\diskreaderwriter.cpp(72) 
(00000000`00d202c0) drive_rw!DiskReaderWriter::ReadDisk | (00000000`00d20410) drive_rw!std::_Iterator_base12::_Adopt 
Exact matches: 
    drive_rw!DiskReaderWriter::ReadDisk (long, unsigned int, class std::vector<unsigned char,std::allocator<unsigned char> > *) 
+0

@nietsa der dekorierte Symbolname existiert auch in öffentlichen pdbs und wird nicht mit x wiedergegeben. ln. oder .fnent sehe meine Antwort zum Abrufen der Parameterinformationen von dem dekorierten Symbolnamen – blabb

3

das Werkzeug dbh.exe in windbg Paket hat eine undec-Befehl und a -dcommand line option, die Sie nutzen können durch die exe in einem sepearte cmd Zeilenfenster an der gleichen Basisadresse wie in windbg Laden und wie unter dieser Prüfung bezieht manuelle Kopie Einfügen des ergänzten Namen

ein Beispiel

dbh -d classmagic.exe 

classmagic [1000000]: b 1350000 <-- base as loaded in windbg 

classmagic [1350000]: a 1351000 

[email protected]@[email protected] 
    name : [email protected]@[email protected] 
    addr : 1351000 
    size : 0 
    flags : 400000 
    type : 0 
modbase : 1350000 
    value :  0 
    reg : 0 
    scope : SymTagNull (0) 
    tag : SymTagPublicSymbol (a) 
    index : 1 

classmagic [1350000]: undec [email protected]@[email protected] 

[email protected]@[email protected] = 
int __cdecl somecrap(int,float,double,char) 

classmagic [1350000]: 

, wenn Sie Automatisierung benötigen und können akzeptieren oder verbessern, wie regex approriate
1) Sie den GnuWin32 Port von Unix/Linux sed.exe in Pfad (abzustreifen modname von k1 Ausgang)
2) anstelle von undname haben sollten.exe Sie sollten vc++filt in Pfad haben
3) Sie sollten die windbg .shell Befehl
4) redecorate den Funktionsnamen mit .symopt- symopt_undname
5) laufen diese Einzeiler der Lage sein, laufen .shell -ci "k1" sed s /.*!// g | vC++ filt

k1 Gebrauch nur ein Rahmen (top of stack)
.shell -CI nimmt einen windbg Befehl und passes the commands output to an external application
Sed strips den Modulnamen und den Knall Charakter xxxxx! und Rohre es vC++ filt
vC++ filt den Symbolnamen de-Mangeln und gibt die formalen Funktionsnamen Bildschirm

ein Beispiel unter

0:000> k1 
ChildEBP RetAddr 
001cf904 013513b5 [email protected]@[email protected] 
0:000> .shell -ci "k1" sed s/.*!//g | vc++filt 
ChildEBP RetAddr 
int __cdecl somecrap(int,float,double,char)