因此,我的系统在晚上运行报告时运行速度非常慢。我已配置性能监视器来监视系统。我发现有一个进程占用了所有 CPU。我想编写一个 Powershell 脚本,当性能计数器被触发时,对进程 ID 进行内存转储。这是我目前所拥有的:
$programid = (Get-Process | Sort-Object CPU -desc | Select-Object -index 1 | Format-Table Id -Autosize -hidetableheader)
$app = "C:\procdump\procdump.exe"
$argument1 = '-ma'
$argument2 = 'c:\appdumps\ -accepteula'
& $app $argument1 $programid $argument2
当我运行脚本时,我得到以下结果:
& $app $argument1 $programid $argument2
ProcDump v7.1 - Writes process dump files
Copyright (C) 2009-2014 Mark Russinovich
Sysinternals - www.sysinternals.com
With contributions from Andrew Richards
Monitors a process and writes a dump file when the process exceeds the
specified criteria or has an exception.
usage: procdump [-a] [[-c|-cl CPU usage] [-u] [-s seconds]] [-n exceeds] [-e [1] [-b]] [-f <filter,...>] [-g] [-h] [
-l] [-m|-ml commit usage] [-ma | -mp] [-o] [-p|-pl counter threshold] [-r [1..5]] [-t] [-d <callback DLL>] [-64] <[-
w] <process name or service name or PID> [dump file] | -i [dump folder] | -u | -x <dump file> <image file> [argument
s] >
-a Avoid outage. Requires -r. If the trigger will cause the target
to suspend for a prolonged time due to an exceeded concurrent
dump limit, the trigger will be skipped.
-b Treat debug breakpoints as exceptions (otherwise ignore them).
-c CPU threshold above which to create a dump of the process.
-cl CPU threshold below which to create a dump of the process.
-d Invoke the minidump callback routine named MiniDumpCallbackRoutine
of the specified DLL.
-e Write a dump when the process encounters an unhandled exception.
Include the 1 to create dump on first chance exceptions.
-f Filter on the content of exceptions and debug logging.
Wildcards (*) are supported.
-g Run as a native debugger in a managed process (no interop).
-h Write dump if process has a hung window (does not respond to
window messages for at least 5 seconds).
-i Install ProcDump as the AeDebug postmortem debugger.
Only -ma, -mp, -d and -r are supported as additional options.
Uninstall (-u only) restores the previous configuration.
-l Display the debug logging of the process.
-m Memory commit threshold in MB at which to create a dump.
-ml Trigger when memory commit drops below specified MB value.
-ma Write a dump file with all process memory. The default
dump format only includes thread and handle information.
-mp Write a dump file with thread and handle information, and all
read/write process memory. To minimize dump size, memory areas
larger than 512MB are searched for, and if found, the largest
area is excluded. A memory area is the collection of same
sized memory allocation areas. The removal of this (cache)
memory reduces Exchange and SQL Server dumps by over 90%.
-n Number of dumps to write before exiting.
-o Overwrite an existing dump file.
-p Trigger on the specified performance counter when the threshold
is exceeded. Note: to specify a process counter when there are
multiple instances of the process running, use the process ID
with the following syntax: "\Process(<name>_<pid>)\counter"
-pl Trigger when performance counter falls below the specified value.
-r Dump using a clone. Concurrent limit is optional (default 1, max 5).
CAUTION: a high concurrency value may impact system performance.
- Windows 7 : Uses Reflection. OS doesn't support -e.
- Windows 8.0 : Uses Reflection. OS doesn't support -e.
- Windows 8.1+: Uses PSS. All trigger types are supported.
-s Consecutive seconds before dump is written (default is 10).
-t Write a dump when the process terminates.
-u Treat CPU usage relative to a single core (used with -c).
As the only option, Uninstalls ProcDump as the postmortem debugger.
-w Wait for the specified process to launch if it's not running.
-x Launch the specified image with optional arguments.
If it is a Store Application or Package, ProcDump will start
on the next activation (only).
-64 By default ProcDump will capture a 32-bit dump of a 32-bit process
when running on 64-bit Windows. This option overrides to create a
64-bit dump. Only use for WOW64 subsystem debugging.
Use the -accepteula command line option to automatically accept the
Sysinternals license agreement.
Use -? -e to see example command lines.
If you omit the dump file name, it defaults to <processname>_<datetime>.dmp.
如果我手动运行此命令:
C:\procdump>procdump.exe -ma 5264 c:\appdumps\ -accepteula
我得到这个输出:
ProcDump v7.1 - Writes process dump files
Copyright (C) 2009-2014 Mark Russinovich
Sysinternals - www.sysinternals.com
With contributions from Andrew Richards
[12:25:06] Dump 1 initiated: c:\appdumps\notepad.exe_151212_122506.dmp
[12:25:07] Dump 1 writing: Estimated dump file size is 53 MB.
[12:25:07] Dump 1 complete: 53 MB written in 1.0 seconds
[12:25:08] Dump count reached.
我知道该命令有效,只是想知道什么没有正确传递。有没有办法设置日志来确定运行时传递给 procdump 的具体内容?
答案1
您在这里将两件事放入一个论点中:
$argument2 = 'c:\appdumps\ -accepteula'
Powershell 不会将其拆分为两个参数,而 ProcessDump 不会将其理解为单个参数。因此,您需要将每个参数放入单独的变量中。