- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
x64 dotnet 服务在应用程序服务器上间歇性崩溃的问题一直存在。该服务可以毫无问题地运行数小时、数天或数周,但随后会因信息不多而崩溃。
该服务在跨两台服务器的集群(每台服务器 3 个服务)中运行 - 两台服务器上的任何服务都出现过崩溃。复制的环境显示相同的行为,所以我已经“用尽”了配置问题的想法。
最初从应用服务器的事件日志中提取的错误是:
Error message from event log on server XXXX
Application: MySvc.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an internal error in the .NET Runtime
at IP 000007FEEFD8CD4C (000007FEEFC70000) with exit code 80131506
这并没有显示太多细节,我在网上找到的最好的指示是“交叉手指”...
Application Crashes With "Internal Error In The .NET Runtime"
http://www.jamesewelch.com/2010/09/30/troubleshooting-internal-error-in-the-net-runtime/
最后,在附加 AdPlus 调试器的情况下运行一个月后,我们遇到了一连串的故障和一些故障转储。既然我有了垃圾,我就很难从它们那里获得任何有用的东西。
我之前调查过一些“挂起”的转储并取得了很大的成功,并阅读了很多 Tess Ferrandez 的博客等,但我所拥有的“崩溃”转储被证明是死胡同。大多数对象、异常等都标记为垃圾收集,并且只剩下主线程 - 我可能遗漏了一些东西。
我将从 !analyze -v 和转储日志中添加详细信息 - 确实显示异常。
所以 - 真正的问题是:有人能给我一些关于从这里前往哪里的指示吗?转储日志中的异常与我在实际转储中看到的不匹配。
在此处转储 1 日志可用: http://pastebin.com/Eg5YCqww
DUMP 1 分析:(我有一个我无法解决的符号问题..)
0:000> !analyze -v
***
FAULTING_IP:
+112c9440
00000000`00000000 ?? ???
EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 0000000000000000
ExceptionCode: 80000003 (Break instruction exception)
ExceptionFlags: 00000000
NumberParameters: 0
FAULTING_THREAD: 00000000000011f8
PROCESS_NAME: MySvc.exe
ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} Breakpoint A breakpoint has been reached.
EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - One or more arguments are invalid
MOD_LIST: <ANALYSIS/>
NTGLOBALFLAG: 0
APPLICATION_VERIFIER_FLAGS: 0
MANAGED_STACK:
(TransitionMU)
000000000022EBB0 000007FEF40CB1AB System_ServiceProcess_ni!DomainBoundILStubClass.IL_STUB_PInvoke(IntPtr)+0x3b
000000000022EC70 000007FEF40CD20D System_ServiceProcess_ni!System.ServiceProcess.ServiceBase.Run(System.ServiceProcess.ServiceBase[])+0x26d
000000000022EDA0 000007FF00170227 MySvc!Ax.Remoting.MySvc.Main()+0x107
(TransitionUM)
MANAGED_STACK_COMMAND: _EFN_StackTrace
BUGCHECK_STR: APPLICATION_FAULT_WRONG_SYMBOLS_FILL_PATTERN_ffffffff
PRIMARY_PROBLEM_CLASS: WRONG_SYMBOLS_FILL_PATTERN_ffffffff
DEFAULT_BUCKET_ID: WRONG_SYMBOLS_FILL_PATTERN_ffffffff
LAST_CONTROL_TRANSFER: from 000007fefd8810ac to 000000007760f6fa
STACK_TEXT:
00000000`0022e818 000007fe`fd8810ac : 00000000`007541f0 000007fe`f40ce089 00000000`0022e9c0 00000000`00000000 : ntdll!ZwWaitForSingleObject+0xa
00000000`0022e820 000007fe`fe7daffb : 00000000`ffffffff 000007fe`fe7d344c 00000000`00000000 00000000`0000032c : KERNELBASE!WaitForSingleObjectEx+0x79
00000000`0022e8c0 000007fe`fe7d9d61 : 00000000`01d47ff0 00000000`0000032c 00000000`00000000 00000000`00000000 : sechost!ScSendResponseReceiveControls+0x13b
00000000`0022e9b0 000007fe`fe7d9c16 : 00000000`0022eb18 00000000`00000000 00000000`00000000 000007fe`00000000 : sechost!ScDispatcherLoop+0x121
00000000`0022eac0 000007fe`f19017c7 : 00000000`11213890 00000000`01d635c0 00000000`00000000 00000000`00000000 : sechost!StartServiceCtrlDispatcherW+0x14e
00000000`0022eb10 000007fe`f40cb1ab : 00000000`01d63680 00000000`0022ebe8 000007fe`f40a5b50 0000bf6c`4589127e : clr!DoNDirectCall__PatchGetThreadCall+0x7b
00000000`0022ebb0 000007fe`f40cd20d : 00000000`01d63680 00000000`00000000 00000000`01d63698 00000000`00000000 : System_ServiceProcess_ni+0x2b1ab
00000000`0022ec70 000007ff`00170227 : 00000000`10ff1ac8 00000000`10ff1af0 00000000`10ff1af0 00000000`10ff1af0 : System_ServiceProcess_ni+0x2d20d
00000000`0022eda0 000007fe`f196dc54 : 00000000`0022ee80 000007fe`f1904e65 ffffffff`fffffffe 00000000`0022f3a0 : 0x7ff`00170227
00000000`0022ee30 000007fe`f196dd69 : 000007ff`000551f8 00000000`00000001 00000000`00000000 00000000`00000000 : clr!CallDescrWorker+0x84
00000000`0022ee70 000007fe`f196dde5 : 00000000`0022ef88 00000000`00000000 00000000`0022ef90 00000000`0022f168 : clr!CallDescrWorkerWithHandler+0xa9
00000000`0022eef0 000007fe`f1a214c5 : 00000000`00000000 00000000`0022f178 00000000`00000000 00000000`00000000 : clr!MethodDesc::CallDescr+0x2a1
00000000`0022f120 000007fe`f1a215fc : 00000000`000ad7c0 00000000`000ad7c0 00000000`00000000 00000000`00000000 : clr!ClassLoader::RunMain+0x228
00000000`0022f370 000007fe`f1a213b2 : 00000000`0022f970 00000000`00000200 00000000`000b7a80 00000000`00000200 : clr!Assembly::ExecuteMainMethod+0xac
00000000`0022f620 000007fe`f1ac6d66 : 00000000`00000000 00000000`10fd0000 00000000`00000000 00000000`00000000 : clr!SystemDomain::ExecuteMainMethod+0x452
00000000`0022fbd0 000007fe`f1ac6c83 : 00000000`10fd0000 00000000`00000000 00000000`00000000 00000000`00000000 : clr!ExecuteEXE+0x43
00000000`0022fc30 000007fe`f1a2c515 : 00000000`000ad7c0 ffffffff`ffffffff 00000000`00000000 00000000`00000000 : clr!CorExeMainInternal+0xc4
00000000`0022fca0 000007fe`f8973309 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`0022fc88 : clr!CorExeMain+0x15
00000000`0022fce0 000007fe`f8a05b21 : 000007fe`f1a2c500 000007fe`f89732c0 00000000`00000000 00000000`00000000 : mscoreei!CorExeMain+0x41
00000000`0022fd10 00000000`773bf56d : 000007fe`f8970000 00000000`00000000 00000000`00000000 00000000`00000000 : mscoree!CorExeMain_Exported+0x57
00000000`0022fd40 00000000`775f2cc1 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0xd
00000000`0022fd70 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d
STACK_COMMAND: ~0s; .ecxr ; kb
FOLLOWUP_IP:
sechost!ScSendResponseReceiveControls+13b
000007fe`fe7daffb 85c0 test eax,eax
SYMBOL_STACK_INDEX: 2
SYMBOL_NAME: sechost!ScSendResponseReceiveControls+13b
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: sechost
IMAGE_NAME: sechost.dll
DEBUG_FLR_IMAGE_TIMESTAMP: 4a5be05e
FAILURE_BUCKET_ID: WRONG_SYMBOLS_FILL_PATTERN_ffffffff_80000003_sechost.dll!ScSendResponseReceiveControls
BUCKET_ID: X64_APPLICATION_FAULT_WRONG_SYMBOLS_FILL_PATTERN_ffffffff_sechost!ScSendResponseReceiveControls+13b
更新 1(12 月 29 日):
从转储日志中重建了一个 CLR 异常,调用堆栈如下。看起来调用数据库时发生异常(通过 ODAC)
clr!RaiseTheExceptionInternalOnly+0x363
clr!IL_Throw+0x146
gm.a(System.String, System.String, Int32, System.String, XXBase, Int32, XXDataParameter[])
gm.b(XXBase, XXBase, Boolean, Boolean, Boolean, Int32)
gm.b(XXBase, XXBase)
od.a(XXGridQueue, TaskStatus, ProcessResult, Int32, Int32, Int32)
od.b(XXGridQueue)
he.b(XXBaseCollection)
he.a(Boolean ByRef)
XX.MySvc.tmr_Elapsed(System.Object)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
重建了访问冲突异常调用堆栈。调用ODAC库后调用垃圾回收器报错。
(1330.1074): Access violation - code c0000005 (first chance)
FirstChance_av_AccessViolation
clr!WKS::gc_heap::plan_phase+0x5ac
clr!WKS::gc_heap::gc1+0xbb
clr!WKS::gc_heap::garbage_collect+0x276
clr!WKS::GCHeap::GarbageCollectGeneration+0x14e
clr!WKS::gc_heap::try_allocate_more_space+0x25f
clr!WKS::GCHeap::Alloc+0x7e
clr!FastAllocatePrimitiveArray+0xc5
clr!JIT_NewArr1+0x389
System.Decimal.GetBits(System.Decimal)
Oracle.DataAccess.Types.DecimalConv.GetDecimal(IntPtr)
Oracle.DataAccess.Client.OracleDataReader.GetDecimal(Int32)
Oracle.DataAccess.Client.OracleDataReader.GetValue(Int32)
Oracle.DataAccess.Client.OracleDataReader.GetValues(System.Object[])
jr.a(System.Data.IDataReader, Boolean, ku, Boolean, DbTypeEnum, System.Type[])
ls.a(System.Data.IDataReader, Boolean, ku, Boolean, DbTypeEnum, System.Type[])
ba.a(System.String, System.Data.IDataReader, Boolean, ku, Boolean, System.Type[])
...
XX.MySvc.tmr_Elapsed(System.Object)
可能的类似问题(来自新信息):http://markmail.org/message/yy3mvbngula4i3mu#query:+page:1+mid:l546gn5sfxtxxm5i+state:results http://social.msdn.microsoft.com/Forums/en/clr/thread/33920b39-690c-42c8-b04a-0f1f7176835a
更新 2(2 月 23 日):
ODAC 组件已升级到 Dotnet 4.0 的正确版本(或在 Oracle 网站上列为兼容的版本),但问题仍然再次出现。它仍然以断断续续的方式再次发生,每隔一两周一次。发生的服务每天循环。
从最近的崩溃中获得更多转储,这些仍然指向堆损坏 - 尽管不是完整转储(访问冲突)。实际上,创建完整转储似乎失败了。
Creating d:\dumps\2xx_Crash_Mode\FULLDUMP_FirstChance_epr_Process_Shut_Down_MySvc.exe__0344.dmp - mini user dump
WriteFullMemory.Memory.Read(0x262c000, 0x1000) failed 0x8007012b, ABORT.
Dump creation failed, Win32 error 0n299
"Only part of a ReadProcessMemory or WriteProcessMemory request was completed."
此外,一个自定义托管(dotnet)库被加载到应用程序中,这似乎也引发了异常,尽管这只是“第一次机会”,而且似乎不会导致进程失败(我猜测这可能是一个因素)。它实际上也是我们的库,所以我能够验证它没有调用托管代码。错误是:
EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 000007fefcffaa7d (KERNELBASE!RaiseException+0x0000000000000039)
ExceptionCode: c0000006 (In-page I/O error)
ExceptionFlags: 00000000
NumberParameters: 3
Parameter[0]: 0000000000000000
Parameter[1]: 000000006d34aca0
Parameter[2]: 00000000c00000c4
Inpage operation failed at 000000006d34aca0, due to I/O error 00000000c00000c4
PROCESS_NAME: MySvc.exe
ERROR_CODE: (NTSTATUS) 0xc0000006 - The instruction at 0x%p referenced memory at 0x%p. The required data was not placed into memory because of an I/O error status of 0x%x.
EXCEPTION_OBJECT: !pe 1a8106a8
Exception object: 000000001a8106a8
Exception type: System.Runtime.InteropServices.SEHException
Message: External component has thrown an exception.
InnerException: <none>
StackTrace (generated):
SP IP Function
000000002C77B980 0000000000000000 ...
000000002C77BA50 000007FF01DCBA51 ...
StackTraceString: <none>
HResult: 80004005
MANAGED_OBJECT: !dumpobj 148306f8
Name: System.String
MethodTable: 000007feed9a6870
EEClass: 000007feed52ed58
Size: 112(0x70) bytes
File: C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
String: External component has thrown an exception.
Fields:
MT Field Offset Type VT Attr Value Name
0000000000000000 4000103 8 System.Int32 1 instance 43 m_stringLength
0000000000000000 4000104 c System.Char 1 instance 45 m_firstChar
000007feed9a6870 4000105 10 System.String 0 shared static Empty
>> Domain:Value 00000000002a69f0:NotInit 000000000dd738d0:NotInit <<
EXCEPTION_MESSAGE: External component has thrown an exception.
MANAGED_OBJECT_NAME: System.Runtime.InteropServices.SEHException
MANAGED_STACK_COMMAND: !pe 1a8106a8
LAST_CONTROL_TRANSFER: from 000007fef47e8fc1 to 000007fefcffaa7d
ADDITIONAL_DEBUG_TEXT: Followup set based on attribute [Is_ChosenCrashFollowupThread] from Frame:[0] on thread:[PSEUDO_THREAD] ; Followup set based on attribute [ip_is_call_value_Arch_si] from Frame:[23] on thread:[162c]
FAULTING_THREAD: ffffffffffffffff
BUGCHECK_STR: APPLICATION_FAULT__SYSTEM.RUNTIME.INTEROPSERVICES.SEHEXCEPTION_APPLICATION_FAULT_CALL
PRIMARY_PROBLEM_CLASS: _SYSTEM.RUNTIME.INTEROPSERVICES.SEHEXCEPTION_CALL
DEFAULT_BUCKET_ID: _SYSTEM.RUNTIME.INTEROPSERVICES.SEHEXCEPTION_CALL
STACK_TEXT:
00000000`2c77b980 00000000`00000000 ...
00000000`2c77ba50 00000000`ffffffff ...
任何对如何以权宜之计进一步追求这一点有任何想法的人。我渴望得到更多的完整转储 - 但当然需要在下一次失败之前找到答案!!
最佳答案
崩溃的原因(断点命中)表示进程中的堆损坏。堆管理功能通过发出调试中断来报告堆损坏故障。
从记录的错误来看,.net 运行时没有准备好处理这些(我可能是错的,可能会有更好的解释)。跟踪堆损坏的常用方法是启用(完整)页面堆,它通过使进程崩溃更接近损坏点来帮助定位有问题的组件。
至少可以说,寻找堆损坏是一件非常痛苦的事情,但如果内存消耗允许的话,我会选择整页堆,这对于内存要求适中的应用程序来说是最有效的。
希望对您有所帮助。
关于c# - WinDbg : Hunting exceptions that have caused a . 网络服务崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8668231/
我正在尝试分析一些小型故障转储。我使用的是 Windows 10 Pro Build 1607 和 WinDbg 10.0.14321.1024。我的符号文件路径设置为 SRV*C:\SymCache
我正在尝试追踪谁在进行特定大小的分配,我尝试使用用户模式堆栈跟踪数据库 (gflags +ust),但由于 FPO,我无法看到整个堆栈。因此,我想在 RtlAllocateHeap 达到我正在寻找的分
是否可以搜索整个可执行内存空间以找到调用特定方法的所有位置?例如,我想从调用 MyApplcation!MyFunction 的位置查找所有函数。使用“s”命令搜索特定的 optcode 不是一个选项
我在我的程序中遇到了一个 stackoverflow 异常,它可能来自第三方库 microsoft.sharepoint.client.runtime.dll。 使用 adplus 创建故障转储,我面
是否有任何扩展命令可以这样做?我只想包含所有参数的整个命令行。 最佳答案 命令行参数等信息存储在 PEB 中(进程环境块)。 您可以找到 a list of common commands here.
在 OllyDbg 中,它允许你运行直到返回,例如你遇到了 ret或 leave操作说明。 WinDbg 支持吗?我在菜单中没有找到这样的功能。 最佳答案 如果您想在返回之前停止,可以使用pt .如果
我正在尝试使用 d* 命令评估 WindDbg 中调用堆栈的内容。我知道我要转储的数据的地址是 [ebp+8] .但是,当使用此命令时,WinDbg 以 8 字节偏移量在 ebp 处转储数据。我想转储
有没有办法告诉 WinDbg 忽略由 DebugBreak function 引起的程序断点? 最佳答案 看看 Controlling Exceptions and Events MSDN 上的页面。
我尝试在 c# 应用程序的源代码中使用 WinDbg 设置断点,但没有成功。 当我使用 WinDbg 时,有没有办法在托管应用程序的源代码处设置断点? 复制步骤如下: 1.制作一个简单的c#应用程序
我正在尝试使用 WinDBG 检查可执行文件的程序集,但我很难找到它。我想在程序的第一条指令处设置断点,但是当我尝试手动执行此操作(使用模块的地址)时,WinDBG 告诉我它“无法在该位置插入断点”,
我正在逆向一个 win32 应用程序。 问题: 调试程序时。我发现计数器曾经跳转到地址 0x0043D4A0。 (这是一个函数入口点)。 0043D4A0 51 P
作为驱动程序开发人员,WinDbg 是我最好的 friend 之一。 现在从 Windows 8 开始,我安装了新的 WDK 并想使用它的新 WinDbg。它具有一些不错的功能,例如通过网络进行远程调
我需要调试在 Windows 上运行的正在运行的程序。它有时会因“内存访问冲突”而崩溃。 使用 windbg(无法使用 IDE)我附加到正在运行的进程(这是程序不得停止的要求) 命令行是 windbg
我正在调查 WinDBG 中的 Windows 转储文件。我可以通过命令 .frame 切换调用堆栈帧,但我发现寄存器始终包含最后一个上下文。我的意思是,是否可以恢复属于非顶级调用堆栈帧的特定调用堆栈
我正在调试一个模块,该模块只有 .exe 和 .pdb,没有私有(private)符号。 在调试 session 期间,我需要检查内部结构。显然这个结构不会出现在 PDB 中,因为它是私有(priva
Intel Power Gadget该工具无法在我的系统上运行,我正试图找出原因。它是运行 Window 8.1 x64 的 Core i7-720QM。 AIDA64 可以很好地读取 CPU 温度,
我在程序中遇到访问冲突。 Windbg 显示程序正在尝试读取 0x09015000 .它在地址旁边显示问号 ( ?? )。我的问题是,这些问号表示什么。它们是否意味着从未分配过内存位置,即它不受任何物
如何将命令窗口的内容直接保存到日志文件中而不在WinDbg的命令窗口显示这些内容? 最佳答案 假设您还不知道这一点,您可以使用 -log{o|a} windbg command line选项来指定您希
我使用的是 WinDBG 6.12.0002.633 X86。 我遇到了命令行调试器 CDB 的问题,它没有显示与 k 的 WinDBG 相同的结果。和 kL命令。 在 WinDBG 中,k命令正确显
我正在开发一个 32 位应用程序,它有时会导致某些 64 位 Windows 7 机器崩溃。我使用 Sysinternals 的 ProcDump 实用程序生成了崩溃的转储文件。 (我使用了命令“pr
我是一名优秀的程序员,十分优秀!