精简版
我想要一个ADPlus脚本,它将在第一次机会StackOverflowException上执行完全内存转储,然后清除任何内容,并忽略所有其他异常类型.
日志版本
在发布新的ASP.NET代码之后,我们开始获得间歇性的StackOverflowExceptions.我们已经寻找无限递归和自上次已知良好安装以来添加的修订版中的所有常见嫌疑人,并且找不到任何内容.该网站将运行长达一个小时,然后崩溃.
我们使用了WinDbg和SOS,并尝试使用ADPlus获取崩溃日志,使用以下命令:
adplus -crash -o D:\Crash -NoDumpOnFirst -iis
Run Code Online (Sandbox Code Playgroud)
-NoDumpOnFirst的原因是我们只能在繁忙的服务器上重现生产中的这个错误.为了对每个第一次机会异常执行minidump(嘿,它发生),调试器必须暂停IIS工作进程足够长时间写出一个16兆字节的文件,因此请求排队并且应用程序变得不稳定.因为这个错误可能需要长达一个小时才能让它变得难看,这是有问题的.
所以使用-NoDumpOnFirst,我得到一个转储文件,WinDbg输出这些线程:
PDB symbol for mscorwks.dll not loaded
ThreadCount: 69
UnstartedThread: 0
BackgroundThread: 69
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
PreEmptive GC Alloc Lock
ID OSID ThreadOBJ State GC Context Domain Count APT Exception
XXXX 1 c6c 000fa758 11808221 Disabled 3b49ee4c:3b49efe8 00120888 1 Ukn (Threadpool Worker)
XXXX 2 1294 000fd258 b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Finalizer)
XXXX 3 1eb0 0011cdd0 80a220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool …
Run Code Online (Sandbox Code Playgroud) 从Windows Vista开始,现在可以从任务管理器生成进程转储.通常我通过使用Adplus或从Windbg直接生成进程转储.如果我使用其中一个选项,我必须使用我的命令提供一些开关,以描述生成了什么类型的转储.鉴于当我从任务管理器生成进程转储时隐藏了所有这些细节,是否有人知道它是什么类型的转储以及它包含的内容?我记得在任何地方读取从任务管理器生成的进程转储不包含句柄表的详细信息.有关于此的任何想法吗?
通过Adplus我附加了一个过程(在我的iis我运行了一个网站)
C:\Program Files (x86)\Debugging Tools for Windows (x86)>ADPlus -crash -pn w3wp .exe -o C:\dumps
Run Code Online (Sandbox Code Playgroud)
下面是重现该网站的stackoverflow异常的代码:
protected void Page_Load(object sender, EventArgs e)
{
}
public void Hello()
{
Hello();
}
protected void Button_Test_Click(object sender, EventArgs e)
{
Hello();
}
Run Code Online (Sandbox Code Playgroud)
为我创建的转储是:
C:\Dumps\Crash_Mode__Date_05-04-2012__Time_21-44-2020\PID-12452__W3WP.EXE_DefaultAppPool__1st_chance_Process_Shut_Down__full_2bc0_2012-05-04_21-45-53-704_30a4
Run Code Online (Sandbox Code Playgroud)
我在windbg中打开了这个转储并运行了这些命令
0:000> .loadby sos clr
0:000> !clrstack
Run Code Online (Sandbox Code Playgroud)
我得到了以下信息
Unable to walk the managed stack. The current thread is likely not a
managed thread. You can run !threads to get a list of managed threads in
the process
Run Code Online (Sandbox Code Playgroud)
你能帮我解决一下吗?如何追踪错误的位置?
我有一个.NET进程,有时会在某些第三方库的本机代码中使用AccessViolationException失败.
当发生这种情况时,我希望有完整的内存迷你转储.我已经阅读了这个页面 - http://support.microsoft.com/kb/931673,"收集用户模式转储"一节,并按照文章的说明配置了注册表.但是,当崩溃发生时,会创建一个非常小的报告 - 看不到*.mdmp文件.
现在,我知道如何从ADPLus中运行该流程,或者如何将其附加到已经运行的流程.但它需要明确地运行ADPLus.
我想知道如何配置窗口自动运行ADPlus,每次我启动有问题的过程无论它是如何启动的 - 从msbuild,双击,从控制台脚本等...
这意味着,运行aaaa.exe时会被运行ADPlus替换为某些标志,这些标志会使用相应的命令行选项生成aaaa.exe.
我知道Windows中有图像执行标志,这样做,但我不知道细节.
谢谢.
EDIT1
保留命令行参数很重要,因此如果aaa.exe使用标志运行,那么当然,从调试器运行aaa.exe时也应如此.
我已将 ADPlus / cdb 设置为计算机上的默认即时调试器。当任何进程出现未处理的异常或因任何其他原因崩溃时,我希望 ADPlus 为我生成故障转储。我使用 ADPlus 配置文件来设置输出目录并运行用于将 dmp 文件推送到云的预命令。
为了进行测试以确保其有效,我编写了一个非常简单的程序,该程序会引发未处理的异常并崩溃。ADPlus 总是像预期的那样附加自身,但它只成功生成我想要的转储,大约为 15 次之一。在不更改系统上的任何内容的情况下,我连续运行崩溃的程序并得到不同的结果。
大多数时候,我从 cdb 收到以下错误:
0:000> g
^ No runnable debuggees error in 'g'
0:000>
*[EOF]*
Run Code Online (Sandbox Code Playgroud)
当它正常工作时,日志中的同一位置如下所示:
0:004> g
FirstChance_epr_Process_Shut_Down
*[More stuff after here]*
Run Code Online (Sandbox Code Playgroud)
知道为什么我会出现这种行为吗?如果有帮助的话,我可以发布我的配置文件和完整日志。何时工作日志和何时不工作日志之间的唯一区别是,所有行均以“何时0:004>
工作”和“0:000>
何时不工作”开头。
我的程序中出现了stackoverflow异常,可能源自第三方库,microsoft.sharepoint.client.runtime.dll.
使用adplus
创建崩溃转储,我面临的问题是,当我在windbg中打开它时,我正在努力从中获取任何信息.这是我作为回应得到的:
> 0:000> .restart /f
Loading Dump File [C:\symbols\FULLDUMP_FirstChance_epr_Process_Shut_Down_DocumentumMigrator.exe__0234_2011-11-17_15-19-59-426_0d80.dmp]
User Mini Dump File with Full Memory: Only application data is available
Comment: 'FirstChance_epr_Process_Shut_Down'
Symbol search path is: C:\symbols
Executable search path is:
Windows 7 Version 7601 (Service Pack 1) MP (8 procs) Free x64
Product: Server, suite: Enterprise TerminalServer SingleUserTS
Machine Name:
Debug session time: Thu Nov 17 15:19:59.000 2011 (UTC + 2:00)
System Uptime: 2 days 2:44:48.177
Process Uptime: 0 days 0:13:05.000
.........................................WARNING: rsaenh overlaps cryptsp …
Run Code Online (Sandbox Code Playgroud) 当我使用ADPlus生成转储文件时,我同时获得第一次机会和第二次机会异常但是当我使用任务管理器生成转储文件时,我只获得一次转储文件.这是第二次机会异常吗?尽管我已经阅读了一些关于它的内容,但我对这第一次和第二次机会异常感到有点困惑.如果有人可以提供一些好的比喻,那可能会为我清理一些事情
我试图在实时ASP.NET 4.0站点上找到间歇性Stack Overflow异常的来源.我使用ADPlus(adplus_old.vbs,而不是新的adplus.exe)使用自定义配置捕获了一些故障转储,这些配置忽略了所有其他类型的异常(请参阅第1个答案:使用WinDbg和ADPlus帮助捕获StackOverflowException).
我在运行应用程序的同一台服务器上运行Windbg.该服务器基于Intel运行64位Win 2003.WinDbg版本为64位64位.我为程序集生成PDB文件,我怀疑异常来自并将它们放在站点的/ bin文件夹中(有几个程序集我没有PDB文件,但我认为它们不涉及此问题).我将环境变量_NT_SYMBOL_PATH指向/ bin文件夹.WinDbg将符号路径显示为:C:\ WINDOWS\Microsoft.NET\Framework64\v4.0.30319; D:\ InetPub\LiveSites\MySite\bin
当我运行WinDbg时,打开崩溃转储后我运行.loadby sos clr然后!clrstack.输出非常小 - 当我在测试站点上设置故意的S/O时,我清楚地看到导致异常的方法.出了什么问题?
Microsoft (R) Windows Debugger Version 6.12.0002.633 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
Loading Dump File [F:\ADPlus\Crash_Mode__Date_02-03-2012__Time_14-36-11PM\PID-9212__W3WP.EXE_-MySite-__1st_chance_StackOverflow__full_0140_2012-02-04_00-24-45-123_23fc.dmp]
User Mini Dump File with Full Memory: Only application data is available
Comment: '1st_chance_StackOverflow_exception_in_W3WP.EXE_-MySite-_running_on_MyServer'
Symbol search path is: C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319;D:\InetPub\LiveSites\MySite\bin
Executable search path is:
Windows Server 2003 Version 3790 (Service Pack 2) MP (8 procs) Free x64
Product: Server, suite: Enterprise TerminalServer SingleUserTS
Machine Name:
Debug …
Run Code Online (Sandbox Code Playgroud) 我一直试图将ADPlus.exe的配置文件放在一起,以确定我的ASP.NET应用程序意外重启的原因。我在理解adplus.config
文件时遇到了一些麻烦。
我在网上发现了例如配置文件,如这一个,包含<Exception Code="xxx">
的部分。这些部分如下所示:
<Exception Code="sov"><!-- StackOverflow -->
<Actions1>VOID</Actions1>
<Actions2>Log;Time;Stack;MiniDump;EventLog</Actions2>
<ReturnAction1>GN</ReturnAction1>
<ReturnAction2>GN</ReturnAction2>
</Exception>
Run Code Online (Sandbox Code Playgroud)
每个例外的三个字母缩写来自哪里?我怎么知道这sov
意味着StackOverflowException?我试图在网上找到这些缩写的列表,但是尽管尝试了各种搜索词组合,但我还是空着。