Windbg - 如何转储与给定过滤器匹配的字符串

时间:2012-09-12 03:23:24

标签: windbg sos

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

如何只转储或打印那些开头或包含特定"字符串的字符串"

实施例。我只是想查看包含" / my / app / request"

的字符串

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

答案 2 :(得分: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

答案 3 :(得分:0)

如果你真的想没有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搜索子字符串
  • 。再次找出s是否找到了什么
  • 一些偏移计算,以获取字符串的第一个字符(+ c)和字符串长度(+8)(乘以2得到字节而不是字符)。那些需要在64位应用程序的情况下进行调整

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