我只是想知道WER写入转储文件的位置?这个位置也是特定于OS的吗?
我依靠Windows错误报告为大型多线程应用程序创建完整的用户模式转储.我知道当我开始使用它时(2012年初),这些转储包含所有应用程序内存,并且所有线程的完整堆栈在应用程序崩溃时都是准确的(抛出未处理的异常等).但是在去年的某个未知点上,WER创建的崩溃转储已经发生了变化.它们仍然包含所有内存,但只显示一个线程,并且堆栈似乎是在进程已经关闭之后来自:
ntdll.dll!_LdrpCallInitRoutine@16() + 0x14 bytes
ntdll.dll!_LdrShutdownProcess@0() + 0x141 bytes
ntdll.dll!_RtlExitUserProcess@4() + 0x74 bytes
kernel32.dll!_UnhandledExceptionFilter@4() + 0x18928 bytes
Run Code Online (Sandbox Code Playgroud)
这是一个使用VS2010 SP1编译的非托管(无法管理?)32位C++应用程序,在64位Win7 SP1上运行(并保持更新).有谁知道在去年改变了WER行为的任何Windows更新?除了'HKLM\SOFTWARE\Microsoft\Windows\Windows错误报告\ LocalDumps\AppName.exe'之外,还有其他可配置的东西吗?
此外,通过调用'RaiseFailFastException'来终止应用程序仍然会导致所有线程都有一个有效堆栈的良好转储.
简而言之,我有一个C#应用程序执行大量mciSendString调用(通过dllimport)来控制wav文件播放(基本上是打开,播放,暂停,停止,状态,关闭).运行一段时间后,应用程序崩溃,恕不另行通知"访问冲突".
即使我从我的vs2012运行应用程序,视觉工作室也没有抓住异常.即使有'强行突破异常'选项,我也没有运气从vs2012调试这个.所以我设置WER来生成崩溃转储,我使用windbg和psscor2.dll插件来调试它.
然后按顺序,使用以下命令,这是我得到的(为了可读性而缩短为必要的):
$>.ecxr
eax=00000001 ebx=00000000 ecx=00000401 edx=00000000 esi=049725b8 edi=00000002
eip=4e88159e esp=0a4efa38 ebp=0a4efa54 iopl=0 nv up ei pl nz ac pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010216
<Unloaded_mciwave.dll>+0x159e:
4e88159e ?? ???
Run Code Online (Sandbox Code Playgroud)
$>〜*KB
# 19 Id: 105c.28cc Suspend: 1 Teb: 7ef06000
Unfrozen
user32!NtUserGetMessage+0x15
user32!GetMessageA+0xa1
winmm!mciwindow+0x102
kernel32!BaseThreadInitThunk+0xe
ntdll!__RtlUserThreadStart+0x70
ntdll!_RtlUserThreadStart+0x1b
# 30 Id: 105c.15f8 Suspend: 0 Teb: 7ef1b000 Unfrozen
ntdll!ZwWaitForMultipleObjects+0x15
KERNELBASE!WaitForMultipleObjectsEx+0x100
kernel32!WaitForMultipleObjectsExImplementation+0xe0
kernel32!WaitForMultipleObjects+0x18
kernel32!WerpReportFaultInternal+0x186
kernel32!WerpReportFault+0x70
kernel32!BasepReportFault+0x20
kernel32!UnhandledExceptionFilter+0x1af
ntdll!__RtlUserThreadStart+0x62
ntdll!_EH4_CallFilterFunc+0x12
ntdll!_except_handler4+0x8e
ntdll!ExecuteHandler2+0x26
ntdll!ExecuteHandler+0x24
ntdll!RtlDispatchException+0x127
ntdll!KiUserExceptionDispatcher+0xf
WARNING: Frame IP not in any known …Run Code Online (Sandbox Code Playgroud) 考虑一下我们有这段代码:
static void Main(string[] args)
{
try
{
throw new Exception("Exception");
}
catch
{
throw;
}
finally
{
Console.WriteLine("------finally-----");
}
}
Run Code Online (Sandbox Code Playgroud)
我们有未处理的异常和finally阻止.
werfault启用后,当我Cancel尝试"自动解决问题"时按下,最后执行块.
但是,如果我没有按下Cancel并在下一个窗口中单击Close The Program finally块不执行.
最后当我禁用werfault并点击Close Program finally块执行时.
我没有在c#规范中找到描述这种情况的任何文档.我也发现了这个MSDN:
在未处理的错误之后执行finally块取决于如何触发异常展开操作.
但没有解释,任何人都可以描述为什么会这样?
更新1:我已在.Net Framework 4.5.1和4.5.2中测试过它.
我正在开发一个PS脚本来生成大量Crystal Reports(Windows 7)的.xml表示.在这个脚本中,我创建了一个对象,表示需要解析的所有文件,然后循环遍历它们,逐个调用它们.exe.偶尔,这个.exe崩溃了.这很好,因为它非常罕见,无法处理的报告可以手动标记和审核.问题是我有数千个.rpt文件要处理,当.exe崩溃时,Windows会弹出一个对话框,要求调试或继续.
我为解决问题而尝试的事情:
HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows错误报告\ DebugApplications:我在这里输入我的exe名称并将值设置为0(不调试)
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows错误报告\ DebugApplications:与上面相同
将调用exe的循环设置为SilentlyContinue
关闭错误报告,如下所示:控制面板>操作中心>更改操作中心设置>问题报告设置>更改所有用户的报告设置>"从不检查解决方案">确定>确定(这仅禁用"Windows可以在线检查". .."对话框)
不过,我正在接收弹出窗口.还有另一个注册表项,它完全禁用"程序已停止工作"UI,但我不想这样做,因为作为其他应用程序的开发人员,我需要知道什么时候崩溃.我只是想从显示UI中排除这个脚本或它调用的exe.
如果我能做到这一点,那么脚本可以无人值守运行.
行为不端的.exe是最新的二进制版本:https://github.com/ajryan/RptToXml,当它在报告文件中遇到空字节时似乎失败了.
这是我的代码:
[xml]$MainConfigFile = Get-Content "settings.config.xml"
[xml]$SSRSConfigFile = Get-Content "ssrs.config.xml"
[xml]$CrystalConfigFile = Get-Content "crystal.config.xml"
# create settings objects from xml objects
$MainSettings = @{
OutputPath = $MainConfigFile.Settings.OutputPath
SearchString = $MainConfigFile.Settings.SearchString
ParseCrystal = $MainConfigFile.Settings.ParseCrystal
ParseSSRS = $MainConfigFile.Settings.ParseSSRS
}
$CrystalSettings = @{
InputFolderPath = $CrystalConfigFile.CrystalSettings.InputFolderPath
ContinueOnError = $CrystalConfigFile.CrystalSettings.ContinueOnError
}
$RsSettings = @{
ReportServerUri = $SSRSConfigFile.RsSettings.ReportServerUri
RsVersion = $SSRSConfigFile.RsSettings.RsVersion
}
Clear
Write-Host "Ensure these settings are …Run Code Online (Sandbox Code Playgroud) 在Windows XP开发期间,如果我的应用程序遇到未处理的异常,它将显示错误消息"X遇到并出现错误..."并为我提供启动调试器的选项.在Windows 7下,我得到的是一条消息"X已停止工作,Windows正在检查解决方案".
我再也看不到错误消息的任何细节了,我没有给出调试选项.
我正在使用VS2005,并且据我所知,JIT调试已启用.
反正有没有回到WinXP的有用错误消息?
编辑:它只是一个标准的WinForms桌面应用程序,无需运行任何特殊权限.
如MSDN所述,我设置了注册表项HKLM \ SOFTWARE \ Microsoft \ Windows \ Windows错误报告\ LocalDumps 。
我有一个测试程序-一个用Visual C ++编译的控制台程序,该程序尝试在打印消息并退出之前取消引用NULL指针。该测试程序曾经用于退出和转储核心文件,但现在它刚刚退出。我没有核心。
我在物理硬件上运行Windows Server 2008 R2 Enterprise SP1。
我不知道发生了什么变化。有什么变化可以阻止WER现在转储内核?
我正在尝试诊断 .NET 4 应用程序的崩溃问题。上次它在用户机器上崩溃时,Windows 错误报告不会收集应用程序的小型转储。我检查了DumpFolder注册表,我可以找到旧崩溃的转储文件,但最后一个没有新的转储文件。
崩溃的事件日志说:
应用程序:MyApp.exe
框架版本:v4.0.30319
描述:由于 IP 000007FEEC0F25E8 (000007FEEC0B0000) 的 .NET 运行时出现内部错误,退出代码为 80131506,该进程被终止。
通过一些搜索看起来像是 CLR x64 中并发 GC 的一个著名错误。事件日志也不同于以前的崩溃。在之前的事件日志中,他们明确表示发生了“访问冲突”。退出代码是一样的。
我无法使用adplus或procdump获取故障转储,因为它们会显着降低性能。我想知道为什么这次 WER 没有得到 mini dump?
我们的一位客户报告了我们的 .NET 应用程序的性能问题。
我们要求他们检查他们的 Windows 事件日志,并注意到 Windows 错误报告记录了几个与应用程序相关的信息级别条目。“AppHangTransient”对 WER 意味着什么?建议可能是挂起是暂时的,但我找不到书面确认。
故障桶,类型 0
事件名称:AppHangTransient
回应:不可用
驾驶室 ID:0
我正在尝试解析 Windows 错误报告报告(Report.wer)。
\n\n以下是报告的一部分:
\n\nVersion=1\nEventType=CLR20r3\n\n... snip ...\n\nSig[0].Name=\xe5\x95\x8f\xe9\xa1\x8c\xe3\x81\xae\xe7\xbd\xb2\xe5\x90\x8d 01\nSig[0].Value=myapp.exe\nSig[1].Name=\xe5\x95\x8f\xe9\xa1\x8c\xe3\x81\xae\xe7\xbd\xb2\xe5\x90\x8d 02\nSig[1].Value=2.2.0.1\nSig[2].Name=\xe5\x95\x8f\xe9\xa1\x8c\xe3\x81\xae\xe7\xbd\xb2\xe5\x90\x8d 03\nSig[2].Value=541bc264\nSig[3].Name=\xe5\x95\x8f\xe9\xa1\x8c\xe3\x81\xae\xe7\xbd\xb2\xe5\x90\x8d 04\nSig[3].Value=System\nSig[4].Name=\xe5\x95\x8f\xe9\xa1\x8c\xe3\x81\xae\xe7\xbd\xb2\xe5\x90\x8d 05\nSig[4].Value=2.0.0.0\nSig[5].Name=\xe5\x95\x8f\xe9\xa1\x8c\xe3\x81\xae\xe7\xbd\xb2\xe5\x90\x8d 06\nSig[5].Value=4a275e12\nSig[6].Name=\xe5\x95\x8f\xe9\xa1\x8c\xe3\x81\xae\xe7\xbd\xb2\xe5\x90\x8d 07\nSig[6].Value=2919\nSig[7].Name=\xe5\x95\x8f\xe9\xa1\x8c\xe3\x81\xae\xe7\xbd\xb2\xe5\x90\x8d 08\nSig[7].Value=ef\nSig[8].Name=\xe5\x95\x8f\xe9\xa1\x8c\xe3\x81\xae\xe7\xbd\xb2\xe5\x90\x8d 09\nSig[8].Value=System.IO.IOException\n\n... snip ...\nRun Code Online (Sandbox Code Playgroud)\n\n(其中的\xe5\x95\x8f\xe9\xa1\x8c\xe3\x81\xae\xe7\xbd\xb2\xe5\x90\x8d意思是Problem Signature。)
由 SO 教授破译 .NET clr20r3 异常参数 P1..P10,我发现:
\n\nSystem2.0.0.0。06002919。ef。但问题是IL偏移值ef。
06002919的方法System没有IL_00ef。
这是该方法的定义06002919:
.method /*06002919*/ assembly hidebysig \n instance bool Poll(int32 microSeconds,\n valuetype System.Net.Sockets.SelectMode/*0200059D*/ …Run Code Online (Sandbox Code Playgroud)