我的一个应用程序有问题.我运行应用程序,一切都很好.当我关闭这个应用程序时,我注意到系统中的一个"svchost"进程占用了大约95-100%的CPU,我必须弄清楚占用了多少CPU周期.
关于如何解决这个问题,我为自己设定了非常简单明了的目标:
选项1: 如何识别这12个服务中哪一个占用了这么多CPU?我是否可以获得有关此svchost流程的扩展信息,该流程为我提供了有关此流程中托管的"每个服务"的详细信息,我现在在流程基础上提供了哪些信息?
选项2: 是否可以配置窗口使svchost每个svchost实例只运行一个服务?
如果有更好的选择如何调查,缩小这个问题的根本原因,请告诉我.
如何找到在Visual Studio调试器下运行的.NET应用程序的当前目录?
更新1.要明确:我不想更改代码或获取程序本身的信息 - 我只想获取有关当前正在调试的应用程序的信息.
在调试.NET Windows Forms应用程序(混合VB.NET和C#)时,我不确定从哪个位置读取XML文件.我希望当前目录是应用程序的目录.但是,使用Process Explorer,进程的属性会导致:
D:\ Program Files(x86)\ Microsoft Visual Studio 9.0\Common7 \
(右键单击进程/属性/选项卡图像/当前目录).
将光标悬停在Process Explorer主视图中的进程上会显示不同的结果(请参见下面的屏幕截图):
d:\ dproj\DTASCall\DTASuperCharge\BIN \
什么是正确的?
独立启动应用程序会显示预期的当前目录,
d:\ dproj\DTASCall\DTASuperCharge\BIN \
在Process Explorer流程属性窗口中.
Process Explorer的带注释的屏幕截图:
替代文字http://www.pil.sdu.dk/1/until2039-12-31/PEdiscrepancy_2009-09-02.png
在Process Explorer中可用的Memory图中,顶部的图显示了Commit History.这在操作系统级别实际表明了什么?
为了试验这是否是进程在堆上分配的内存,我编写了一个小程序,该程序逐步malloc-ed 100 MB多次.提交历史记录图表增加了一段时间(内存分配高达1.7 GB)并且在此之后没有增长,尽管程序内存存储器.
那么,这个图表表示什么?如何使用这些信息来理解/分析Windows的状态?
我正试图在Sharpdx/DirectX应用程序中寻找可能的内存泄漏.
我从流程资源管理器中获取以下信息,我不知道如何解释.

假设我已经安装了多个版本的软件,一些DLL被注册为COM.例如:
.../version1/Application.exe
normal.dll
comObject.dll -- register as COM to use
.../version2/Application.exe
normal.dll
comObject.dll -- register as COM to use
Run Code Online (Sandbox Code Playgroud)
怎么知道哪个comObject.dll已注册?(哪个路径?在文件夹"version1"或"version2"下?) 答:这样做的一种方法是使用"Process Explorer",转到"Find | Find Handle or DLL ... ",输入"comObject.dll"然后单击"搜索"按钮. 然后路径显示在列表中.
现在谈谈我的问题:如果一个软件包很庞大,安装了数百个基于COM的DLL,我不想手动打开"Peocess Explorer"并在搜索结果中搜索每个DLL/OCX/EXE,我不可能将列表内容复制出来!!
我想要的只是一个像下面的命令一样运行的工具,我可以在一个bat文件中运行.
ProcessExplorer.exe -Find "comObject1.dll" -append "C:\temp\output.txt"
ProcessExplorer.exe -Find "comObject2.dll" -append "C:\temp\output.txt"
ProcessExplorer.exe -Find "comObject3.dll" -append "C:\temp\output.txt"
Run Code Online (Sandbox Code Playgroud)
output.txt可能如下所示:
Process PID Type Handle or DLL
comObject1.dll 1 DLL C:\ApplicationExample\Version1\comObject1.dll
comObject2.dll 1 DLL C:\ApplicationExample\Version1\comObject2.dll
comObject3.dll 1 DLL C:\ApplicationExample\Version2\comObject3.dll
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,comObject1.dll和comObject2.dll来自Version1文件夹,而comObject3.dll来自Version2文件夹.
如果我要说的任何内容毫无意义或忽视了一些显而易见的东西,那么道歉 - 我对CLR内部的了解是不稳定的.
如果我理解正确,那么如果我只是在VS2K5中为'AnyCPU'构建一个解决方案(或者使用这些设置指向那个.sln文件的MSBuild),那么二进制文件只能编译到MSIL.然后,如果在32位平台上执行,它们会被JIT打成32位,如果在x64上执行,它们会被64位代码...对吧?
这些DLL用于Web应用程序并托管在W3WP.exe进程中.Process Explorer告诉我W3WP是一个64位进程.
但是当我使用Process Explorer在DLL视图中检查其中一个DLL的属性时,它会显示:'Image:32-bit'.是什么赋予了?
如果我对有问题的DLL运行corflags它会告诉我:ILONLY 1,32BIT 0但是PE PE32.我的理解是,这意味着它只是编译到IL,不是它不限于32位或64位,但我不完全清楚.PE32标志是否与它上面显示的32位有关?
我有一个基于3.5的多线程wpf应用程序.当我通过Process Explorer查看正在运行的线程时,我看到8个线程都具有相同的起始地址,ntdll.dll!RtlUserThreadStart,并且所有8个线程的CPU值均为3-6 +且具有高的Cycles Delta.我无法弄清楚这些线程在做什么.它始终是相同的线程.它永远不会在应用程序的同一个实例中发生变化.当我同时调试我的应用程序并暂停调试器时,所有这些线程都显示堆栈的单行,System.Threading.ConcurrencyScheduler.Scheduler.WaitForWork()或System.Threading.Monitor.Wait().
我启用了Visual Studio的符号文件,我在这些线程上看到了以下堆栈:
System.Threading.Monitor.Wait() Normal
mscorlib.dll!System.Threading.Monitor.Wait(object obj, int millisecondsTimeout) + 0x19 bytes
System.Threading.dll!System.Threading.ConcurrencyScheduler.Scheduler.WaitForWork() + 0xd0 bytes
System.Threading.dll!System.Threading.ConcurrencyScheduler.InternalContext.Dispatch() + 0x74a bytes
System.Threading.dll!System.Threading.ConcurrencyScheduler.ThreadInternalContext.ThreadStartBridge(System.IntPtr dummy) + 0x9f bytes
Run Code Online (Sandbox Code Playgroud)
当我查看进程监视器中线程上提供的堆栈时,我看到以下示例:
0 ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a
1 ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732
2 ntoskrnl.exe!KeWaitForSingleObject+0x19f
3 ntoskrnl.exe!_misaligned_access+0xba4
4 ntoskrnl.exe!_misaligned_access+0x1821
5 ntoskrnl.exe!_misaligned_access+0x1a97
6 mscorwks.dll!InitializeFusion+0x990b
7 mscorwks.dll!DeleteShadowCache+0x31ef
Run Code Online (Sandbox Code Playgroud)
要么:
0 ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a
1 ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732
2 ntoskrnl.exe!KeWaitForSingleObject+0x19f
3 ntoskrnl.exe!_misaligned_access+0xba4
4 ntoskrnl.exe!_misaligned_access+0x1821
5 ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x93d
6 ntoskrnl.exe!KeWaitForMultipleObjects+0x26a
7 ntoskrnl.exe!NtWaitForSingleObject+0x41f
8 ntoskrnl.exe!NtWaitForSingleObject+0x78e
9 ntoskrnl.exe!KeSynchronizeExecution+0x3a23
10 ntdll.dll!ZwWaitForMultipleObjects+0xa
11 KERNELBASE.dll!GetCurrentProcess+0x40
12 KERNEL32.dll!WaitForMultipleObjectsEx+0xb3
13 mscorwks.dll!CreateApplicationContext+0x10499
14 mscorwks.dll!CreateApplicationContext+0xbc41
15 mscorwks.dll!StrongNameFreeBuffer+0xc54d
16 mscorwks.dll!StrongNameFreeBuffer+0x2ac48 …Run Code Online (Sandbox Code Playgroud) 下午好,
我从几年前继承了一些C#代码.我已经重构了一点异步.评估我的更改对CPU性能的影响,我使用Process Explorer大致观察我的应用程序在做什么.令我惊讶的是,它似乎正在进行Process Explorer报告的I/O. 通常,这与磁盘I/O或网络I/O有关.根据我所看到的代码,我无法找出对这两个I/O源中的任何一个的显式调用.
我的问题是:确定哪一部分代码导致I/O的最佳方法是什么?我们使用JetBrains中的dotTrace来分析我们的应用程序,但是,据我所知,它只处理CPU和内存性能.
提前感谢任何指针.
问候,
埃里克.
我正试图在我的.NET应用程序中追踪内存泄漏.Windows任务管理器报告内存使用率保持不变,而Process Explorer报告内存使用率正在提高.
在任务管理器中,我正在寻找唯一的内存列,"内存(私有工作集)".在Process Explorer中,我正在查看"Private bytes"列,因为它正在提升,而"Working set"下的值则没有.
现在,当然Process Explorer是正确的,因为在几次分配之后,我的应用程序因内存不足异常而崩溃.问题是,为什么任务管理器误报了应用程序的内存使用情况?不仅如此,它还误报了全局系统的可用内存("性能"选项卡中的图形保持不变).
我的代码不应该被需要,但这是为了完整性.它显示了一个包含大数组的空窗口.当按下任何键时,窗口关闭并打开一个新窗口,并保持一个新阵列.旧窗口已泄露,可能是由于qt4dotnet GUI库中的错误.
using System;
using com.trolltech.qt.gui;
namespace LeakTest
{
class Test : QWidget
{
public byte[] Data = new byte[1000 * 1000 * 100];
public Test()
{
show();
GC.Collect(); // so measurements are more accurate
}
protected override void keyPressEvent(QKeyEvent arg__1)
{
disposeLater();
new Test();
}
[STAThread]
static void Main(string[] args)
{
QApplication.initialize(args);
new Test();
QApplication.exec();
}
}
}
Run Code Online (Sandbox Code Playgroud)
操作系统:Windows 7
有趣的说明:当我将"数据"作为2D锯齿状维度数组时[1000 * …
我正在尝试对我的大型财务计算运行所需的内存量进行非常粗略的测量.它是一个非常简单的命令行工具,可以为大量金融工具定价,然后打印出结果.
我决定使用Process Explorer来查看程序的内存要求.有人可以解释屏幕截图中标记为a和b的两个字段之间的区别:
我目前相信:
标记为"a"(峰值专用字节数)的值是在任何瞬时分配给进程的最大内存量(实际物理内存和磁盘上的虚拟内存).
标记为"b"(Peal Working Set)的值是在该过程的生命周期中的任何时刻分配的最大物理内存量.
有没有一种优雅的方法可以将环境变量从Process Explorer复制到Process的剪贴板?我试图比较两个C++编译过程,并想看看环境变量是如何不同的.似乎我无法复制文本,然后将其粘贴到视觉上进行比较.
注意我宁愿坚持使用PE而不是使用多种工具,但如果使用其他工具是唯一的选择,请随时提出建议.
同时将其标记为C++,期望从C++开发人员/调试者的角度来看解决方案,包括使用Visual C++
我正在试图找到如何做到这一点,我正在使用CreateToolHelp32SnapShot来获取正在运行的进程的列表,我已经获得了当前正在运行的可执行文件的FilePath,但我需要能够找到使用了什么命令行选项来启动进程.
我知道它可能,因为你可以在Process Explorer上看到它,我试着找到旧的Process Explorer的源代码,但没有运气:(
process-explorer ×13
windows ×6
.net ×3
winapi ×3
c# ×2
c++ ×2
memory-leaks ×2
process ×2
64-bit ×1
clr ×1
com ×1
corflags ×1
debugging ×1
delphi ×1
directx ×1
dll ×1
find ×1
gpu ×1
profiling ×1
sharpdx ×1
sysinternals ×1
taskmanager ×1
visual-c++ ×1
windows-7 ×1