4

可以使用以下命令转储所有字符串 !dumpheap -type System.string

如何只转储或打印那些开始或包含特定“字符串”的字符串

例子。我只想查看包含“/my/app/request”的字符串

4

4 回答 4

4

为此,请使用 sosex 而不是 sos。它有一个!strings命令,允许您使用该/m:<filter>选项过滤字符串。

于 2012-09-12T14:46:39.937 回答
3

使用!sosex.strings。有关根据内容和/或长度过滤字符串的选项,请参阅 !sosex.help。

于 2012-09-12T14:44:45.130 回答
1

如果您真的想不使用 SOSEX,请尝试

.foreach (string {!dumpheap -short -type System.String}) { .foreach (search {s -u ${string}+c ${string}+c+2*poi(${string}+8) "mySearchTerm"}) { du /c80 ${string}+c }}

它用

  • !dumpheap 获取 .NET 堆上的所有字符串
  • .foreach 迭代它们
  • s 搜索子字符串
  • .foreach 再次查看 s 是否发现了什么
  • 一些偏移量计算以获取字符串的第一个字符 (+c) 和字符串长度 (+8)(乘以 2 以获取字节而不是字符)。这些需要在 64 位应用程序的情况下进行调整

/c80 只是为了更好的输出。如果您喜欢字符串的 .NET 详细信息,也可以使用!do ${string}而不是。du /c80 ${string}+c

于 2013-12-27T23:15:11.863 回答
1

不确定 !dumpheap 是否支持。您始终可以使用 .logopen 将输出重定向到文件并对其进行后处理。对于更优雅(因此也更复杂)的解决方案,您还可以使用 .shell 将命令输出重定向到 shell 进程进行解析。这是一个例子:

http://blogs.msdn.com/b/baleixo/archive/2008/09/06/using-shell-to-search-text.aspx

您还可以查看 .shell 文档了解更多详细信息:

http://msdn.microsoft.com/en-us/library/windows/hardware/ff565339(v=vs.85).aspx

于 2012-09-12T14:32:28.287 回答