我的程序是用C++编写的.用gcc编译,使用-g3 -O0 -ggdb标志.当它崩溃时,我想打开它的核心转储.它是创建核心转储文件,还是我需要在程序本身或执行它的计算机上执行某些操作以启用核心转储?创建此文件的位置,名称是什么?
我有一个.NET服务,其正常的私有工作集大约为80 MB.在最近的负载测试期间,进程达到3.5 GB内存使用量,导致整个机器的物理内存不足(使用4 GB中的3.9),并且在负载测试停止后很长时间内内存未释放.使用任务管理器,我获取了该进程的转储文件并在Visual Studio 2010 SP1中打开它,我可以开始调试它.
我如何诊断内存问题?我有dotTrace Memory 3.x,它是否支持转储文件的内存分析?如果没有,Visual Studio 2010 Premium的内存分析功能是否有帮助(我目前有专业版)?WinDbg可以帮忙吗?
更新:新的Visual Studio 2013 Ultimate现在可以使用转储文件本机诊断内存问题.有关详细信息,请参阅此博客文章.
.net memory-leaks crash-dumps visual-studio-2010 memory-profiling
我使用的是Visual Studio 2010专业版和Windows Vista.
首先,我有这个代码.如你所见,它会使程序崩溃!
using System;
namespace Crash
{
class Program
{
static void Main(string[] args)
{
string a = null;
if (a.Length == 12)
{
// ^^ Crash
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
该程序将在if语句中崩溃.现在,我想知道它在if语句中崩溃了.
如果我从Visual Studio"开始没有调试",Crash.exe崩溃.它使用1,356kb的内存.我得到了Close Program/Debug的Vista选项.如果我选择Debug,我可以打开一个新的Visual Studio实例,它指向if语句的NullReferenceException.这很好.
现在让我假设它在另一台计算机上崩溃了,我让他们通过任务管理器给我一个转储文件.它是54,567kb.为什么这么大!这是巨大的!无论如何,我对此不太感兴趣(略)
如果我用Windbg打开那个转储,我对未经训练的眼睛几乎没有用处:
Microsoft (R) Windows Debugger Version 6.12.0002.633 X86
Copyright (c) Microsoft Corporation. All rights reserved.
Loading Dump File [C:\Users\Richard\Desktop\Crash.DMP]
User Mini Dump File with Full Memory: Only application data is available
Symbol search path is: SRV*C:\SYMBOLS*http://msdl.microsoft.com/download/symbols
Executable search path is: …Run Code Online (Sandbox Code Playgroud) 我刚刚开始查看转储文件,以帮助我分析工作中生产环境中w3wp进程的崩溃...
我想知道,minidump和fulldump文件之间有什么区别?
我知道如何使用ADPlus或DebugDiag生成Crash Dump文件,但我想知道是否有办法在客户的计算机上执行此操作而不安装这些工具...具体来说,我希望能够配置我的应用程序(例如,使用注册表值)在严重故障的情况下生成崩溃转储.更具体地说,我需要能够从C#应用程序执行此操作,但如果有必要,我不介意P/Invoke.谢谢!
我想更改核心转储文件的默认位置,以便每次生成核心转储时,它都会转到该目录.此外,是否可以通过此位置中崩溃文件的名称保存转储文件?
我有一个托管应用程序创建的转储.我正在使用SOS/SOSEX扩展来简化我的转储分析.我想像~*kb使用本机应用程序一样列出所有托管线程的调用堆栈.我们怎么做?
如何防止在IIS/ASP.NET转储文件中提交和接收ASP.NET网页的密码和其他敏感数据?
重现步骤
请注意,使用HTTPS无关紧要,因为它只会加密通信.ASP.NET将数据存储在内存或磁盘中.
问题
通用的智慧是加密敏感数据而不是将其存储在清晰的数据中.但是,员工可能会收到IIS/ASP.NET应用程序的转储并发现用户的密码和其他机密数据,因为此信息既未加密,也未在使用后清除ASP.NET使用的内存.
这使他们处于危险之中,因为他们可以访问它.有时会与合作伙伴(例如Microsoft)共享转储,以帮助他们诊断代码中的问题.它是在一个应用程序中诊断一些非常复杂的问题的必要部分.
我看到的东西
我希望的是告诉IIS/ASP.NET特定请求/响应包含敏感数据,并且IIS/ASP.NET将在使用它时清除内存.