当堆包含数百万个对象时,如何将 !dumpheap 的输出转储到文件中? [英] How to dump the output of !dumpheap into a file, when the heap contains millions of objects?

查看:20
本文介绍了当堆包含数百万个对象时,如何将 !dumpheap 的输出转储到文件中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请注意:

0:000> !dumpheap -stat
Statistics:
              MT    Count    TotalSize Class Name
000007fefa9c8c58        1           24 System.ServiceProcess.Res
000007fef99d3de8        1           24 System.Collections.Generic.GenericArraySortHelper`1[[System.DateTime, mscorlib]]
000007fef99cf8e8        1           24 System.Collections.Generic.GenericComparer`1[[System.Decimal, mscorlib]]
...
000007fef8f02090    47295    141585288 System.Char[]
000007fe9b1cbe20  1064155    229857480 Xyz.DataServices.Platform.BalanceTransactionForAccrualByOrg
000007fef8f06888    21401    238104833 System.Byte[]
000007fe9cd2efb8  1211503    358604888 Xyz.DataServices.Platform.AEBalanceTransaction
0000000000386b30 11759620   1701611244      Free
000007fef8e94918   777049   2352540408 System.Object[]
000007fe9c4370e8 10571587   2621753576 Xyz.DB.DL.HREEmployeeManager
000007fef8f00e08 131198125   1859306044 System.String
Total 163792779 objects
Fragmented blocks larger than 0.5 MB:
            Addr     Size      Followed by
...

这意味着我在堆上有数十(数亿?)数百万个对象.我想将有关它们的信息转储到一个文件中.

Which means I have tens (hundreds?) of millions of objects on the heap. I would like to dump the information about them into a file.

所以 如何将windbg 命令重定向到文件而不在windbg 控制台上回显输出? 告诉我该方法,但是当我们谈论数十(数百?)数百万行时,这是我们能得到的最好的方法?

So How to redirect windbg command to a file without echoing the output on the windbg console? tells me the approach, but is it the best we can get when we are talking about tens (hundreds?) of millions of rows?

我想知道是否有一个编程 API,我可以针对它进行编程以直接从转储中提取数据,而不是通过 WinDBG 用户界面.或者也许有一个插件已经做到了......

I was wondering whether there is a programmatic API against which I could program to extract the data from the dump directly, rather than through WinDBG user interface. Or maybe there a plugin out there that already does it...

推荐答案

在一天结束时,我编写了一个 powershell 脚本来使用 CDB 运行单个调试器命令.然后将输出保存到文件中.

At the end of the day I have written a powershell script to run a single debugger command using CDB. Then the output is saved to the file.

这是:

param(
  [Parameter(Mandatory=$true, Position = 0)][ValidateScript({Test-Path $_ })]
  $dump,
  [Parameter(ParameterSetName='cmd', Mandatory=$true, Position = 1)][ValidateNotNullOrEmpty()]
  $command,
  [Parameter(ParameterSetName='script', Mandatory=$true)][ValidateNotNullOrEmpty()]
  $scriptFile,
  [Parameter(ParameterSetName='init', Mandatory=$true)][ValidateNotNullOrEmpty()][switch]
  $init,
  [Parameter()]
  $imagePath,
  [Parameter()]
  $sosexPath = "e:\utils\sosex\64\sosex.dll",
  [Parameter()][switch]
  $ScanForImages,
  [Parameter()][switch]
  $NoSymbolServer,
  [Parameter()][switch]
  $NoExit
)
$dump = (dir $dump).FullName

$cdb = "C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\cdb.exe"
$InternalScriptFile = [io.path]::GetTempFileName()
$log = [io.path]::GetTempFileName()

if ($ScanForImages)
{
  $ImgScan = ".imgscan /l"
}

Set-Content $InternalScriptFile @"
.logopen `"${log}.init`"
.load $sosexPath
"@

if ($init)
{
  $CDBOutputDevice = "Out-Default"
  Add-Content $InternalScriptFile @"
.logclose
!bhi
"@
}
elseif ($command)
{
  $CDBOutputDevice = "Out-Null"
  Add-Content $InternalScriptFile @"
!lhi
$ImgScan
.logclose
.logopen `"${log}`"
$command
.logclose
"@
}
else
{
  $CDBOutputDevice = "Out-Null"
  Add-Content $InternalScriptFile @"
!lhi
$ImgScan
.logclose
.logopen `"${log}`"
"@
  Get-Content $scriptFile | Out-File -FilePath $InternalScriptFile -Encoding ASCII -Append
  Add-Content $InternalScriptFile @"
.logclose
"@
}

if ($NoExit)
{
  $CDBOutputDevice = "Out-Default"
}
else
{
  Add-Content $InternalScriptFile @"
q
"@
}

if ($NoSymbolServer)
{
  $symbols = "e:\Symbols"
}
else
{
  $symbols = "cache*e:\Symbols;srv*http://localhost:33417;srv*http://msdl.microsoft.com/download/symbols"
}
if (Test-Path $imagePath -PathType Container)
{
  $symbols = "$imagePath;$symbols"
}

&$cdb -cf $InternalScriptFile -z $dump -y $symbols | &$CDBOutputDevice
if (!$init -and !$NoExit)
{
  cat $log
}

不理想 - 我愿意改进.但它有效.

Not ideal - I am open to improvements. But it works.

这篇关于当堆包含数百万个对象时,如何将 !dumpheap 的输出转储到文件中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆