s (Rechercher dans la mémoire)
La commande s recherche dans la mémoire pour trouver un modèle d’octet spécifique.
Ne confondez pas cette commande avec les ~s (Modifier le processeur actuel), ~s (Définir le thread actuel), |s (Définir le processus actuel)ou ||commandes s (Définir le système actuel).
s [-[[Flags]Type]] Range Pattern
s -[[Flags]]v Range Object
s -[[Flags]]sa Range
s -[[Flags]]su Range
Paramètres
[ Indicateurs]
Spécifie une ou plusieurs options de recherche. Chaque indicateur est une lettre unique. Vous devez placer les indicateurs entre crochets ([]). Vous ne pouvez pas ajouter d’espaces entre les crochets, sauf entre n ou l et son argument. Par exemple, si vous souhaitez spécifier les options s et w , utilisez le modèle de plage de types -[sw].
Vous pouvez spécifier un ou plusieurs des indicateurs suivants :
s
Enregistre tous les résultats de la recherche actuelle. Vous pouvez utiliser ces résultats pour répéter la recherche ultérieurement.
r
Limite la recherche actuelle aux résultats de la dernière recherche enregistrée. Vous ne pouvez pas utiliser les indicateurs s et r dans la même commande. Lorsque vous utilisez r, la valeur de la plage est ignorée et le débogueur recherche uniquement les accès enregistrés par la commande s précédente.
n Hits
Spécifie le nombre de correspondances à enregistrer lorsque vous utilisez l’indicateur s . La valeur par défaut est 1024 accès. Si vous utilisez n avec d’autres indicateurs, n doit être le dernier indicateur, suivi de son argument Hits . L’espace entre n et Hits est facultatif, mais vous ne pouvez pas ajouter d’autres espaces entre crochets. Si une recherche ultérieure qui utilise l’indicateur s détecte plus que le nombre spécifié de correspondances, le message d’erreur Overflow s’affiche pour vous avertir que toutes les correspondances ne sont pas enregistrées.
l Longueur
Provoque une recherche de chaînes ASCII ou Unicode arbitraires pour renvoyer uniquement des chaînes qui sont au moins des caractères de longueur . La longueur par défaut est 3. Cette valeur affecte uniquement les recherches qui utilisent les indicateurs -sa ou -su .
w
Recherche uniquement les régions de mémoire accessibles en écriture. Vous devez placer le « w » entre crochets.
1
Affiche uniquement les adresses des correspondances de recherche dans la sortie de recherche. Cette option est utile si vous utilisez le jeton .foreach pour diriger la sortie de commande dans l’entrée d’une autre commande.
Type
Spécifie le type de mémoire à rechercher. Ajoutez un trait d’union (-) devant Type . Vous pouvez utiliser l’une des valeurs de type suivantes.
Type | Description |
---|---|
b |
Octet (8 bits) |
w |
WORD (16 bits) |
d |
DWORD (32 bits) |
t |
QWORD (64 bits) |
a |
Chaîne ASCII (pas nécessairement une chaîne terminée par null) |
u |
Chaîne Unicode (pas nécessairement une chaîne terminée par null) |
Si vous omettez type, les valeurs d’octet sont utilisées. Toutefois, si vous utilisez des indicateurs, vous ne pouvez pas omettre le type.
sa
Recherche toute mémoire qui contient des chaînes ASCII imprimables. Utilisez l’indicateur Longueur pour spécifier une longueur minimale de ces chaînes. La longueur minimale par défaut est de 3 caractères.
su
Recherche toute mémoire qui contient des chaînes Unicode imprimables. Utilisez l’indicateur Longueur pour spécifier une longueur minimale de ces chaînes. La longueur minimale par défaut est de 3 caractères.
Gamme
Spécifie la zone mémoire à rechercher. Cette plage ne peut pas dépasser 256 Mo, sauf si vous utilisez la syntaxe L ? Pour plus d’informations sur cette syntaxe, consultez La syntaxe adresse et plage d’adresses.
Modèle
Spécifie une ou plusieurs valeurs à rechercher. Par défaut, ces valeurs sont des valeurs d’octets. Vous pouvez spécifier différents types de mémoire dans Type. Si vous spécifiez une valeur WORD, DWORD ou QWORD, selon les autres options sélectionnées, vous devrez peut-être placer le modèle de recherche entre guillemets simples (par exemple, « H »).
0:000> s -d @rsp L1000000 'H'
0000003f`ff07ec00 00000048 00000000 500c0163 00000000 H.......c..P....
0000003f`ff07ec50 00000048 00000000 00000080 00000000 H...............
0000003f`ff07efc0 00000048 00000000 400c0060 00000000 H.......`..@....
Si vous spécifiez une chaîne, en utilisant le type ascii, placez-la entre guillemets doubles (par exemple, « B7 »).
0:000> s -a @rsp L10000000 "B7"
0000003f`ff07ef0a 42 37 ff 7f 00 00 90 38-4e c2 6c 01 00 00 7d 26 B7.....8N.l...}&
0000003f`ff0ff322 42 37 ff 7f 00 00 f8 5d-42 37 ff 7f 00 00 20 41 B7.....]B7.... A
0000003f`ff0ff32a 42 37 ff 7f 00 00 20 41-42 37 ff 7f 00 00 98 59 B7.... AB7.....Y
-v
Recherche des objets du même type que l’objet spécifié.
Objet
Spécifie l’adresse d’un objet ou l’adresse d’un pointeur vers un objet. Le débogueur recherche ensuite les objets du même type que l’objet spécifié par Object .
Environnement
Élément | Description |
---|---|
Modes | Mode utilisateur, mode noyau |
Targets | Live, vidage de la mémoire |
Platforms | Tous |
Informations supplémentaires
Pour plus d’informations sur la manipulation de la mémoire et une description d’autres commandes liées à la mémoire, consultez Lecture et écriture de la mémoire.
Notes
Si le débogueur trouve le modèle d’octet que vous spécifiez, le débogueur affiche la première adresse mémoire dans la zone mémoire plage où le modèle a été trouvé. Le débogueur affiche un extrait de mémoire qui commence à cet emplacement dans un format qui correspond au type de mémoire type spécifié. Si le type est un ou u, le contenu de la mémoire et les caractères ASCII ou Unicode correspondants sont affichés.
Vous devez spécifier le paramètre Pattern comme une série d’octets, sauf si vous spécifiez une valeur de type différente. Vous pouvez entrer des valeurs d’octet en tant que caractères numériques ou ASCII :
Les valeurs numériques sont interprétées comme des nombres dans le radix actuel (16, 10 ou 8). Pour modifier le radix par défaut, utilisez la commande n (Définir la base de nombres). Vous pouvez remplacer la base par défaut en spécifiant le préfixe 0x (hexadécimal), le préfixe 0n (décimal), le préfixe 0t (octal) ou le préfixe 0y (binaire). Notez que le radix par défaut se comporte différemment lorsque vous utilisez des expressions C++. Pour plus d’informations sur ces expressions et le radix, consultez Évaluation des expressions.
Vous devez placer des caractères ASCII entre guillemets simples. Vous ne pouvez pas utiliser de caractères d’échappement de style C (par exemple, « \0 » ou « \n »).
Si vous spécifiez plusieurs octets, vous devez les séparer par des espaces.
Les commandes s-a et s-u recherchent respectivement les chaînes ASCII et Unicode spécifiées. Ces chaînes n’ont pas besoin d’être terminées par null.
Les commandes s-sa et s-su recherchent des chaînes ASCII et Unicode non spécifiées. Ces éléments sont utiles si vous vérifiez une plage de mémoire pour voir s’il contient des caractères imprimables. Les options d’indicateurs vous permettent de spécifier une longueur minimale de chaîne à rechercher.
Exemple : la commande suivante recherche des chaînes ASCII de longueur >=3 dans la plage commençant à 0000000140000000 et terminant 400 octets plus tard.
s-sa 0000000140000000 L400
La commande suivante recherche des chaînes ASCII de longueur >=4 dans la plage commençant à 0000000140000000 et terminant 400 octets plus tard
s -[l4]sa 0000000140000000 L400
La commande suivante fait la même chose, mais elle limite la recherche aux régions de mémoire accessibles en écriture.
s -[wl4]sa 0000000140000000 L400
La commande suivante fait la même chose, mais affiche uniquement l’adresse de la correspondance, plutôt que l’adresse et la valeur.
s -[1wl4]sa 0000000140000000 L400
La commande s-v recherche des objets du même type de données que l’objet Object . Vous pouvez utiliser cette commande uniquement si l’objet souhaité est une classe C++ ou un autre objet associé à des tables de fonctions virtuelles (Vtables). La commande s-v recherche dans la zone mémoire plage les adresses des tables virtuelles de cette classe. Si plusieurs tables virtuelles existent dans cette classe, l’algorithme de recherche recherche recherche toutes ces valeurs de pointeur, séparées par le nombre approprié d’octets. Si des correspondances sont trouvées, le débogueur retourne l’adresse de base de l’objet et des informations complètes sur cet objet, similaires à la sortie de la commande dt (Type d’affichage).
Exemple : Supposons que le radix actuel soit 16. Les trois commandes suivantes font toutes la même chose : rechercher les emplacements de mémoire 0012FF40 à 0012FF5F pour « Hello ».
0:000> s 0012ff40 L20 'H' 'e' 'l' 'l' 'o'
0:000> s 0012ff40 L20 48 65 6c 6c 6f
0:000> s -a 0012ff40 L20 "Hello"
Ces commandes recherchent chaque apparence de « Hello » et retournent l’adresse de chacun de ces modèles, c’est-à-dire l’adresse de la lettre « H ».
Le débogueur retourne uniquement les modèles entièrement contenus dans la plage de recherche. Les modèles qui se chevauchent sont trouvés correctement. (En d’autres termes, le modèle « QQQ » est trouvé trois fois dans « QQQQQ ».
L’exemple suivant montre une recherche qui utilise le paramètre Type . Cette commande recherche les emplacements de mémoire 0012FF40 à 0012FF5F pour le double mot « VUTS » :
0:000> s -d 0012ff40 L20 'VUTS'
Sur les ordinateurs peu endiens, « VUTS » est le même que le modèle d’octet « S » « T » « U » « V ». Toutefois, les recherches de WORD, DWORDs et QWORD retournent uniquement les résultats correctement alignés sur les octets.