asp.net – 帮助捕获StackOverflowException与WinDbg和ADPlus

前端之家收集整理的这篇文章主要介绍了asp.net – 帮助捕获StackOverflowException与WinDbg和ADPlus前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
简短版本

我想要一个ADPlus脚本,在任何事情被清理之前,首次碰巧StackOverflowException将完成内存转储,并忽略所有其他异常类型。

日志版本

在发布新的ASP.NET代码之后,我们开始获取间歇性StackOverflowExceptions。我们已经寻找无限递归和自上次已知的安装以来添加的修订版本中的所有常见疑犯,并且找不到任何内容。该网站将运行长达一个小时,然后崩溃。

我们已经使用WinDbg和SOS,并尝试使用ADPlus获取崩溃日志,使用以下命令:

  1. adplus -crash -o D:\Crash -NoDumpOnFirst -iis

-NoDumpOnFirst的原因是我们只能在繁忙的服务器上重现生产中的错误。为了在每个第一次机会异常(嘿,它发生)做一个minidump调试器必须暂停IIS工作进程足够长的时间写出一个16兆文件,所以请求排队,应用程序变得不稳定。因为这个错误可能需要一个小时的时间才能让人头痛,所以这是有问题的。

所以使用-NoDumpOnFirst,我得到一个转储文件,WinDbg输出这些线程为:

  1. PDB symbol for mscorwks.dll not loaded
  2. ThreadCount: 69
  3. UnstartedThread: 0
  4. BackgroundThread: 69
  5. PendingThread: 0
  6. DeadThread: 0
  7. Hosted Runtime: no
  8. PreEmptive GC Alloc Lock
  9. ID OSID ThreadOBJ State GC Context Domain Count APT Exception
  10. XXXX 1 c6c 000fa758 11808221 Disabled 3b49ee4c:3b49efe8 00120888 1 Ukn (Threadpool Worker)
  11. XXXX 2 1294 000fd258 b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Finalizer)
  12. XXXX 3 1eb0 0011cdd0 80a220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Completion Port)
  13. XXXX 4 1b3c 00120198 1220 Enabled 00000000:00000000 000df4e0 0 Ukn
  14. XXXX 5 1280 00138118 880a220 Enabled 2633de9c:2633ee08 000df4e0 0 Ukn (Threadpool Completion Port)
  15. XXXX 6 1db8 00158a48 1180a221 Disabled 4b5a7e2c:4b5a82e8 00120888 1 Ukn (Threadpool Worker)
  16. XXXX 9 141c 00162008 180a220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker)
  17. XXXX 7 1574 00174008 180a220 Enabled 4d46b6a8:4d46c158 00120888 2 Ukn (Threadpool Worker)
  18. XXXX c 16c8 0016b7a8 180a220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker)
  19. XXXX 8 1384 00162878 180a220 Enabled 284e26a4:284e45d8 000df4e0 0 Ukn (Threadpool Worker)
  20. XXXX b 1c10 0016b3d8 180a220 Enabled 3ed2dae0:3ed2dfe8 00120888 2 Ukn (Threadpool Worker)
  21. XXXX a 1814 0016b008 180a220 Disabled 28816384:28816638 00120888 1 Ukn (Threadpool Worker)
  22. XXXX d 1fc 1b4d1ff0 220 Enabled 319f89a4:319fa41c 000df4e0 0 Ukn
  23. XXXX e 1864 1b4e3d20 180b220 Enabled 4b2c5be0:4b2c6150 000df4e0 0 Ukn (Threadpool Worker)
  24. XXXX f 13bc 1b57caf8 200b220 Enabled 4cc71584:4cc73414 00120888 1 Ukn
  25. XXXX 10 72c 1f5124a8 180b220 Enabled 3b4b3414:3b4b4fe8 00120888 2 Ukn (Threadpool Worker)
  26. XXXX 11 1fd0 1f526398 180b220 Disabled 4d46f41c:4d470158 00120888 1 Ukn (Threadpool Worker)
  27. XXXX 12 1f10 1f52f1c8 180b220 Enabled 28812c14:28814638 00120888 2 Ukn (Threadpool Worker)
  28. XXXX 13 1b84 1f53a420 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  29. XXXX 14 18a4 1f570978 180b220 Enabled 263e18b4:263e2e28 000df4e0 0 Ukn (Threadpool Worker)
  30. XXXX 15 1a98 1f57f0a0 180b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker)
  31. XXXX 16 1b4 1f583628 180b220 Enabled 495781ec:4957914c 00120888 2 Ukn (Threadpool Worker)
  32. XXXX 17 b90 1f585dc8 180b220 Enabled 265cbe48:265ccba4 000df4e0 0 Ukn (Threadpool Worker)
  33. XXXX 18 1590 1f613c60 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  34. XXXX 19 1850 1f5fad90 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  35. XXXX 1a c78 1f60d3f0 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  36. XXXX 1c 1bd8 2121f1b0 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  37. XXXX 1d 494 1b4a8c10 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  38. XXXX 1e 898 2120f120 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  39. XXXX 1f 1820 21355ff8 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  40. XXXX 20 15b0 3570e120 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  41. XXXX 21 18b0 359ca008 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  42. XXXX 22 75c 35a58948 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  43. XXXX 25 1a18 213ac8f8 880b220 Disabled 3219a830:3219b450 00120888 1 Ukn (Threadpool Completion Port) System.StackOverflowException (0e3200a4)
  44. XXXX 29 1b74 3598e620 180b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker)
  45. XXXX 2a 9b8 3598dbe0 180b220 Enabled 2880ef2c:28810638 000df4e0 0 Ukn (Threadpool Worker)
  46. XXXX 2b 1eac 1f6f6288 180b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker)
  47. XXXX 2d 2f4 211759e8 180b220 Disabled 2634eacc:2634ee08 00120888 1 Ukn (Threadpool Worker)
  48. XXXX 2e 1e3c 35c2eb60 880b220 Enabled 4b5a5758:4b5a62e8 000df4e0 0 Ukn (Threadpool Completion Port)
  49. XXXX 30 394 35c394f8 180b220 Enabled 4cef7930:4cef90d4 000df4e0 0 Ukn (Threadpool Worker)
  50. XXXX 31 1e64 35c39128 180b220 Disabled 288110b0:28812638 00120888 1 Ukn (Threadpool Worker)
  51. XXXX 32 1af8 35a58578 180b220 Enabled 3b48e7cc:3b48efe8 000df4e0 0 Ukn (Threadpool Worker)
  52. XXXX 34 1d44 1f6a6c88 180b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker)
  53. XXXX 35 197c 212088e0 180b220 Enabled 49389ba8:4938af40 000df4e0 0 Ukn (Threadpool Worker)
  54. XXXX 36 1e2c 35c1d980 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  55. XXXX 38 1ddc 212d03d8 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  56. XXXX 39 288 212d0008 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  57. XXXX 3a 1694 212bf958 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  58. XXXX 3b be4 212ccc40 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  59. XXXX 37 ccc 35c4d6d0 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  60. XXXX 3c 14ec 35c55af0 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  61. XXXX 41 1d94 35c38c08 180b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker)
  62. XXXX 24 130 35746a50 180b220 Enabled 2670ae48:2670cc00 000df4e0 0 Ukn (Threadpool Worker)
  63. XXXX 2f 1404 35c1d350 180b220 Enabled 00000000:00000000 000df4e0 0 Ukn (Threadpool Worker)
  64. XXXX 43 1ae8 35c25cb8 180b220 Disabled 3b4c28e0:3b4c2fe8 00120888 1 Ukn (Threadpool Worker)
  65. XXXX 44 18ac 212cc870 180b220 Disabled 4957e728:4957f14c 00120888 1 Ukn (Threadpool Worker)
  66. XXXX 45 18b4 212bf588 180b220 Disabled 3b4c05dc:3b4c0fe8 00120888 1 Ukn (Threadpool Worker)
  67. XXXX 46 1c0c 21239858 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  68. XXXX 47 4fc 21188b68 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  69. XXXX 48 1198 35caa2a8 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  70. XXXX 49 1f9c 21147af8 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  71. XXXX 4a 1adc 35cc6908 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  72. XXXX 4b ce8 35c60e30 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  73. XXXX 4d 6f0 35d05aa0 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  74. XXXX 4e 1ee8 35c1b6b0 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  75. XXXX 42 1d7c 35d9a230 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  76. XXXX 3d 7d8 212e1b28 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  77. XXXX 23 c0c 503ea010 220 Enabled 00000000:00000000 000df4e0 0 Ukn
  78. XXXX 27 1f44 503cdf08 220 Enabled 00000000:00000000 000df4e0 0 Ukn

尝试打印异常表明没有堆栈跟踪,其他方法抱怨它是非托管代码。我的猜测是,由于转储是在进程死亡时创建的,所有的线程都被垃圾收集,没有任何信息可以获取

我真的希望调试器在StackOverflowException的第一次机会上执行完全转储,并忽略所有其他异常类型。我知道ADPlus可以使用配置文件http://msdn.microsoft.com/en-us/library/cc409304.aspx – 但是格式对我来说都是希望。任何人都可以告诉我如何制作一个ADPlus脚本呢?

…当然,如果你看上面的线程列表,你确切知道是什么问题,或者可以弄清楚,如果我给了你更多的信息,你也可以告诉我。

分辨率尝试1

谢谢你以下答案,这是不正确的,但推动我在正确的方向。堆栈溢出的异常代码是不正确的(这是sbo不是sov),(或者所以我以为在当时,看到以下的thinkok的编辑),所以我尝试调试与以下配置:

  1. <ADPlus>
  2. <!-- Add log entry,log faulting thread stack and dump full on first chance StackOverflow -->
  3. <Exceptions>
  4. <Config>
  5. <!-- This is for the StackOverflow exception -->
  6. <Code> sbo </Code>
  7. <Actions1> Log;Stack;FullDump </Actions1>
  8. <!-- Depending on what you intend - either stop the debugger (Q or QQ) or continue unhandled (GN) -->
  9. <ReturnAction1> GN </ReturnAction1>
  10. </Config>
  11. </Exceptions>
  12. </ADPlus>

并使用以下命令:

  1. adplus -crash -o D:\Crash -NoDumpOnFirst -c D:\Crash\stackoverflow.cfg -iis

我验证输出的日志文件指示了正确的配置。诀窍是adplus的命令行参数按顺序执行,所以如果您从配置中捕获第一次机会异常,然后应用-NoDumpOnFirst,配置设置将被覆盖。如果最后用-c应用配置,那么它的设置将会胜出。

然而,最后,堆栈溢出被证明是无法匹配的。堆栈溢出发生,不能收到内存转储,然后在第二次机会进程结束事件发生转储,并且一切都被垃圾收集,我无法获得任何有用的信息。

我试图使进程结束异常短路,以防万一引发和覆盖堆栈溢出,但是发生异常,我没有内存转储。

幸运的是,我通过检查代码绊倒了答案。当然是循环方法调用的一个例子。

实际决议

这个问题早已解决了,但是我很快就创建了一个ASP.NET页面,这将导致堆栈溢出。 (毕竟不难做),并尝试下面的Axl的回应。

XML稍微关闭 – Axl只是忘了关闭< / ADPlus>标签(或probaby在复制粘贴中丢失它),但这很容易修复,adplus是足够好的告诉我什么是错误的。

我把这个脚本放在我的测试堆栈溢出抛出器上,加载了windbg的结果,当我打电话给clrstack时,我得到了一个非常清楚(和很长的)循环调用方法列表。这将立即发现问题!我会把这个页面保留在书签下一次堆栈溢出敲我的门。

解决方法

为了防止这可能有助于别人,下面是我提出的 ADPlus配置文件。现在看看,我不知道,失控有什么影响。当引起StackOverflowException的ASP.NET应用程序正在运行时,这将在指定的OutputDir中生成“1st chance StackOverflow full”和“1st chance Process Shutdown full”.dmp文件。用 Windbg打开第一个文件,并运行“.loadby sos mscorwks”,然后运行“!clrstack”来查看可能导致堆栈溢出的情况。
  1. <ADPlus>
  2. <Settings>
  3. <RunMode>CRASH</RunMode>
  4. <OutputDir>C:\Dumps</OutputDir>
  5. <ProcessName>w3wp.exe</ProcessName>
  6. </Settings>
  7. <Exceptions>
  8. <Option>FullDumpOnFirstChance</Option>
  9. <Option>MiniDumpOnSecondChance</Option>
  10. <Option>NoDumpOnFirstChance</Option>
  11. <Option>NoDumpOnSecondChance</Option>
  12. <Config>
  13. <Code>AllExceptions</Code>
  14. <Actions1>Void</Actions1>
  15. <Actions2>Void</Actions2>
  16. <ReturnAction1>GN</ReturnAction1>
  17. <ReturnAction2>GN</ReturnAction2>
  18. </Config>
  19. <Config>
  20. <!--
  21. av = AccessViolation
  22. ch = InvalidHandle
  23. ii = IllegalInstruction
  24. dz = IntegerDivide
  25. c000008e = FloatingDivide
  26. iov = IntegerOverflow
  27. lsq = InvalidLockSequence
  28. sov = StackOverflowException
  29. eh = CPlusPlusEH
  30. * = UnknownException
  31. clr = NET_CLR
  32. bpe = CONTRL_C_OR_Debug_Break
  33. ld = DLL_Load
  34. ud = DLL_UnLoad
  35. epr = Process_Shut_Down
  36. sbo = Stack_buffer_overflow
  37. -->
  38. <Code>sov;sbo</Code>
  39. <Actions1>Log;Time;Stack;FullDump;EventLog</Actions1>
  40. <CustomActions1>!runaway</CustomActions1>
  41. <Actions2>Log;Time;Stack;FullDump;EventLog</Actions2>
  42. <CustomActions2>!runaway</CustomActions2>
  43. <!--
  44. G = go
  45. GN = go unhandled exception
  46. GH = go handled exception
  47. Q = quit
  48. QD = quit and detach
  49. -->
  50. <ReturnAction1>GN</ReturnAction1>
  51. <ReturnAction2>GN</ReturnAction2>
  52. </Config>
  53. <Config>
  54. <Code>clr</Code>
  55. <Actions1>Void</Actions1>
  56. <Actions2>Log;Time;Stack;FullDump;EventLog</Actions2>
  57. <ReturnAction1>GN</ReturnAction1>
  58. <ReturnAction2>GN</ReturnAction2>
  59. </Config>
  60. <Config>
  61. <Code>epr</Code>
  62. <Actions1>Log;Time;Stack;FullDump;EventLog</Actions1>
  63. <Actions2>Void</Actions2>
  64. <ReturnAction1>GN</ReturnAction1>
  65. <ReturnAction2>GN</ReturnAction2>
  66. </Config>
  67. </Exceptions>
  68. </ADPlus>

猜你在找的asp.Net相关文章