Debugging .Net String Wert in windbg

8

Ich habe einen .Net-Anwendungs-Dump, der eine Ausnahme erfasst hat, ich analysiere mit windbg und interessiert mich für den Wert eines String-Parameters bei einer der Methoden. Ich habe das String-Objekt isoliert. Mein Windbing funktioniert:

%Vor%

Die m_stringLength-Membervariable gibt an, dass die Zeichenfolge 179 Zeichen lang ist. Bei der Überprüfung der Zeichenfolge scheint sie jedoch nur 32 Zeichen lang zu sein. Ein Blick auf den Speicher für diese Zeichenfolge scheint NULL beendet zu sein. Nach dem abschließenden NULL-Zeichen gibt es mehr Zeichen. Dies kann wiederverwendeter Speicher oder eine Zeichenfolgenbeschädigung sein, der Pfad sieht jedoch wie angezeigt korrekt aus. Die ausgelöste Ausnahme ist 'Unzulässige Zeichen im Pfad', aber in diesem Pfad befinden sich keine ungültigen Zeichen. Der Call-Stack für diese Ausnahme ist also:

%Vor%

Verarbeitet die System.IO.Path.CheckInvalidPathChars-Methode die Zeichenfolge mit der in m_stringLength gefundenen Länge oder berücksichtigt sie die NULL-Beendigung in der Zeichenfolge selbst? Ich bin auch offen für die Tatsache, dass etwas anderes falsch ist, wenn Sie etwas entdecken können, das ich nicht habe.

    
MrBry 07.06.2011, 09:56
quelle

2 Antworten

1

Was System.IO.Path.CheckInvalidPathChars tut (zumindest in .NET 2.0):

%Vor%

Beachten Sie, dass der interessante Teil von string.Length fehlt, dh wie string tatsächlich seine length -Eigenschaft freigibt:

%Vor%

Ich würde versuchen, das Problem nach Möglichkeit zu simulieren, indem ich die genaue Zeichenkette (bis zur Länge, die in m_stringLength gespeichert ist) abruft und versuche, das Problem zu reproduzieren.

    
lysergic-acid 07.06.2011, 11:06
quelle
5

Ich würde die tatsächliche Zeichenfolge aus dem Speicher in der Datei ablegen, um den Inhalt zu überprüfen, anstatt nur auf die Ausgabe in windbg zu schauen.

Hier ist ein Windbg-Skript, das ich vor einiger Zeit geschrieben habe, um die Strings in eine Datei zu schreiben.

%Vor%

Die Idee besteht darin, den Befehl .writemem zu verwenden, um den Inhalt in eine Datei zu speichern.

Der Inhalt des Dumps würde im Unicode-Format sein, und um seinen Inhalt anzuzeigen, verwenden Sie so etwas

Console.WriteLine(ASCIIEncoding.Unicode.GetString(File.ReadAllBytes(@"c:\temp\stringtest03575270.txt")));

HTH

    
Naveen 07.06.2011 13:28
quelle