WinDbg et SoS, comment puis-je imprimer/dump une grande chaîne?
Je suis le débogage d'un hangdump à venir à partir d'un serveur de production à l'aide de WinDbg avec l'extension SoS.
Il y a un paramètre de chaîne dans l'une des piles, que j'ai besoin de connaître la valeur de. Cependant, il est une grande chaîne, et WinDbg de ne pas l'imprimer quand je suis en utilisant DumpObj
. C'est la sortie de DumpObj
:
0:036> !do 00000001b30d8668
Name: System.String
MethodTable: 0000064278436728
EEClass: 000006427803e520
Size: 5125300(0x4e34b4) bytes
(C:\WINDOWS\assembly\GAC_64\mscorlib.0.0.0__b77a5c561934e089\mscorlib.dll)
String: <String is invalid or too large to print>
Fields:
MT Field Offset Type VT Attr Value Name
000006427843d998 4000096 8 System.Int32 1 instance 2562638 m_arrayLength
000006427843d998 4000097 c System.Int32 1 instance 2562637 m_stringLength
0000064278438170 4000098 10 System.Char 1 instance 3c m_firstChar
0000064278436728 4000099 20 System.String 0 shared static Empty
>> Domain:Value 0000000000163260:000000007fff0370 00000000001a6760:000000007fff0370 <<
0000064278438020 400009a 28 System.Char[] 0 shared static WhitespaceChars
>> Domain:Value 0000000000163260:000000007fff0b60 00000000001a6760:000000007fff89f0 <<
Comment puis-je obtenir la valeur de cette chaîne ? De préférence exportée vers un fichier.
OriginalL'auteur driis | 2011-03-18
Vous devez vous connecter pour publier un commentaire.
Je pense à deux fois avant de dumping 2562638 caractères de la valeur de texte, mais si vous voulez vraiment, le texte est stocké suivant les domaines de la chaîne d'instance, de sorte que vous pouvez faire un
du <address+offset> <end address>
pour vider le texte de la chaîne. La sortie devrait ressembler à quelque chose comme ceci:Par l'enregistrement de la session de la sortie vers un fichier, vous pouvez facilement capturer la sortie et de faire ce post-traitement dont vous avez besoin.
Je reçois le même message dans le journal comme dans la Fenêtre de Commande: <String n'est pas valide ou trop grand pour imprimer>
Je ne comprends pas. Quelle est la commande que vous tapez?
OriginalL'auteur Brian Rasmussen
Voici un script que j'ai écrit pour le vidage des chaînes de caractères dans un fichier dans windbg.
et c'est comment il peut être utilisé
$$>a<”c:\temp\dumpstringtofolder.txt” 6544f9ac 5000 c:\temp\stringtest
L'objet d'un dumping contenu devrait être au format Unicode et pour afficher son contenu utiliser quelque chose comme cela
Console.WriteLine(ASCIIEncoding.Unicode.GetString(File.ReadAllBytes(@"c:\temp\stringtest03575270.txt")));
HTH
J'ai été en mesure de vidage de la chaîne à l'aide de ce script et je l'utilise souvent. Quel était le problème de l'exécution? Êtes-vous à l'aide en x86/x64?
Vous ne savez pas si nous pouvons compter sur la sortie de !Name2EE mais cela peut être utilisé pour obtenir la méthode de la table de pointeur automatiquement (r@$t1), donc on pourrait se débarrasser de paramètre 1. .foreach /pS 7 /ps 4 (methodtable {!Name2EE mscorlib.dll Système.String}) { r@$t1= ${methodtable} }
d'accord. Il peut être automatisé à l'aide de
!Name2EE
OriginalL'auteur Naveen
Si vous êtes pressé, exécutez la !faire après activation des journaux dans WinDbg. Dans le fichier journal, vous obtiendrez l'ensemble de la chaîne.
Dans WinDbg menu, allez dans Edit-> Ouvrir/Fermer le fichier journal, pour définir le chemin du fichier journal.
Je reçois le même message dans le journal comme dans la Fenêtre de Commande: <String n'est pas valide ou trop grand pour imprimer>
OriginalL'auteur thewpfguy