2009-05-06 13 views
16

Short VersionTrợ giúp bắt StackOverflowException với WinDbg và ADPlus

Tôi muốn một kịch bản ADPlus rằng sẽ làm một bãi chứa bộ nhớ đầy đủ trên StackOverflowException đầu cơ hội, trước khi bất cứ điều gì được làm sạch lên, và bỏ qua tất cả các loại ngoại lệ khác.

Log Version

Sau một phát hành mã ASP.NET mới, chúng tôi bắt đầu nhận được StackOverflowExceptions liên tục. Chúng tôi đã tìm kiếm các cuộc truy tìm vô hạn và tất cả các nghi phạm thông thường trong các bản sửa đổi được thêm vào kể từ lần cài đặt tốt cuối cùng được biết đến và không thể tìm thấy bất cứ điều gì. Trang web sẽ chạy trong tối đa một giờ và sau đó bị lỗi.

Chúng tôi đã sử dụng WinDbg và SOS và cố gắng để có được các bản ghi tai nạn sử dụng ADPlus, sử dụng lệnh này:

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

Lý do cho -NoDumpOnFirst là chúng ta chỉ có thể tái sản xuất lỗi này trong sản xuất trên các máy chủ bận rộn. Để làm một minidump trên mỗi ngoại lệ cơ hội đầu tiên (hey, nó xảy ra) trình gỡ lỗi phải tạm dừng quá trình IIS công nhân đủ dài để viết ra một tập tin 16 meg, do đó, yêu cầu xếp hàng và ứng dụng trở nên không ổn định. Bởi vì lỗi có thể mất đến một giờ để phía sau nó là đầu xấu xí, điều này là có vấn đề.

Vì vậy, với -NoDumpOnFirst, tôi nhận được một tập tin dump rằng WinDbg kết quả đầu ra các đề cho:

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 Completion Port) 
XXXX 4 1b3c 00120198  1220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 5 1280 00138118 880a220 Enabled 2633de9c:2633ee08 000df4e0  0 Ukn (Threadpool Completion Port) 
XXXX 6 1db8 00158a48 1180a221 Disabled 4b5a7e2c:4b5a82e8 00120888  1 Ukn (Threadpool Worker) 
XXXX 9 141c 00162008 180a220 Enabled 00000000:00000000 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 7 1574 00174008 180a220 Enabled 4d46b6a8:4d46c158 00120888  2 Ukn (Threadpool Worker) 
XXXX c 16c8 0016b7a8 180a220 Enabled 00000000:00000000 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 8 1384 00162878 180a220 Enabled 284e26a4:284e45d8 000df4e0  0 Ukn (Threadpool Worker) 
XXXX b 1c10 0016b3d8 180a220 Enabled 3ed2dae0:3ed2dfe8 00120888  2 Ukn (Threadpool Worker) 
XXXX a 1814 0016b008 180a220 Disabled 28816384:28816638 00120888  1 Ukn (Threadpool Worker) 
XXXX d 1fc 1b4d1ff0  220 Enabled 319f89a4:319fa41c 000df4e0  0 Ukn 
XXXX e 1864 1b4e3d20 180b220 Enabled 4b2c5be0:4b2c6150 000df4e0  0 Ukn (Threadpool Worker) 
XXXX f 13bc 1b57caf8 200b220 Enabled 4cc71584:4cc73414 00120888  1 Ukn 
XXXX 10 72c 1f5124a8 180b220 Enabled 3b4b3414:3b4b4fe8 00120888  2 Ukn (Threadpool Worker) 
XXXX 11 1fd0 1f526398 180b220 Disabled 4d46f41c:4d470158 00120888  1 Ukn (Threadpool Worker) 
XXXX 12 1f10 1f52f1c8 180b220 Enabled 28812c14:28814638 00120888  2 Ukn (Threadpool Worker) 
XXXX 13 1b84 1f53a420  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 14 18a4 1f570978 180b220 Enabled 263e18b4:263e2e28 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 15 1a98 1f57f0a0 180b220 Enabled 00000000:00000000 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 16 1b4 1f583628 180b220 Enabled 495781ec:4957914c 00120888  2 Ukn (Threadpool Worker) 
XXXX 17 b90 1f585dc8 180b220 Enabled 265cbe48:265ccba4 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 18 1590 1f613c60  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 19 1850 1f5fad90  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 1a c78 1f60d3f0  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 1c 1bd8 2121f1b0  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 1d 494 1b4a8c10  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 1e 898 2120f120  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 1f 1820 21355ff8  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 20 15b0 3570e120  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 21 18b0 359ca008  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 22 75c 35a58948  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 25 1a18 213ac8f8 880b220 Disabled 3219a830:3219b450 00120888  1 Ukn (Threadpool Completion Port) System.StackOverflowException (0e3200a4) 
XXXX 29 1b74 3598e620 180b220 Enabled 00000000:00000000 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 2a 9b8 3598dbe0 180b220 Enabled 2880ef2c:28810638 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 2b 1eac 1f6f6288 180b220 Enabled 00000000:00000000 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 2d 2f4 211759e8 180b220 Disabled 2634eacc:2634ee08 00120888  1 Ukn (Threadpool Worker) 
XXXX 2e 1e3c 35c2eb60 880b220 Enabled 4b5a5758:4b5a62e8 000df4e0  0 Ukn (Threadpool Completion Port) 
XXXX 30 394 35c394f8 180b220 Enabled 4cef7930:4cef90d4 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 31 1e64 35c39128 180b220 Disabled 288110b0:28812638 00120888  1 Ukn (Threadpool Worker) 
XXXX 32 1af8 35a58578 180b220 Enabled 3b48e7cc:3b48efe8 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 34 1d44 1f6a6c88 180b220 Enabled 00000000:00000000 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 35 197c 212088e0 180b220 Enabled 49389ba8:4938af40 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 36 1e2c 35c1d980  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 38 1ddc 212d03d8  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 39 288 212d0008  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 3a 1694 212bf958  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 3b be4 212ccc40  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 37 ccc 35c4d6d0  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 3c 14ec 35c55af0  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 41 1d94 35c38c08 180b220 Enabled 00000000:00000000 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 24 130 35746a50 180b220 Enabled 2670ae48:2670cc00 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 2f 1404 35c1d350 180b220 Enabled 00000000:00000000 000df4e0  0 Ukn (Threadpool Worker) 
XXXX 43 1ae8 35c25cb8 180b220 Disabled 3b4c28e0:3b4c2fe8 00120888  1 Ukn (Threadpool Worker) 
XXXX 44 18ac 212cc870 180b220 Disabled 4957e728:4957f14c 00120888  1 Ukn (Threadpool Worker) 
XXXX 45 18b4 212bf588 180b220 Disabled 3b4c05dc:3b4c0fe8 00120888  1 Ukn (Threadpool Worker) 
XXXX 46 1c0c 21239858  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 47 4fc 21188b68  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 48 1198 35caa2a8  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 49 1f9c 21147af8  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 4a 1adc 35cc6908  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 4b ce8 35c60e30  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 4d 6f0 35d05aa0  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 4e 1ee8 35c1b6b0  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 42 1d7c 35d9a230  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 3d 7d8 212e1b28  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 23 c0c 503ea010  220 Enabled 00000000:00000000 000df4e0  0 Ukn 
XXXX 27 1f44 503cdf08  220 Enabled 00000000:00000000 000df4e0  0 Ukn 

Đang cố gắng để in các ngoại lệ cho thấy không có dấu vết ngăn xếp, và các phương pháp khác phàn nàn rằng nó là mã không được quản lý. Tôi đoán là khi bãi chứa được tạo ra ở quá trình chết, tất cả các chủ đề đã được thu thập rác và không có thông tin còn lại để có được.

Tôi thực sự muốn có trình gỡ lỗi thực hiện một kết xuất đầy đủ trên cơ hội đầu tiên của StackOverflowException và bỏ qua tất cả các loại ngoại lệ khác. Tôi biết rằng ADPlus có thể sử dụng tệp cấu hình - http://msdn.microsoft.com/en-us/library/cc409304.aspx - nhưng định dạng là tất cả tiếng Hy Lạp đối với tôi. Bất cứ ai có thể chỉ cho tôi làm thế nào để thực hiện một kịch bản ADPlus sẽ làm điều này?

... tất nhiên nếu bạn nhìn vào danh sách chủ đề ở trên và bạn biết chính xác điều gì sai hoặc có thể tìm ra nếu tôi cung cấp thêm thông tin cho bạn, bạn cũng có thể cho tôi biết điều đó.

Nghị quyết Cố gắng 1

Cảm ơn bạn deemok cho câu trả lời dưới đây, nó không phải là hoàn toàn đúng nhưng điều đó đã đẩy tôi đi đúng hướng. Mã ngoại lệ cho Stack Overflow là không chính xác (nó SBO không SOV), (hoặc vì vậy tôi nghĩ vào thời điểm đó, xem chỉnh sửa deemok của dưới đây) vì vậy tôi cố gắng gỡ lỗi với cấu hình sau:

<ADPlus> 
    <!-- Add log entry, log faulting thread stack and dump full on first chance StackOverflow --> 
<Exceptions> 
    <Config> 
     <!-- This is for the StackOverflow exception --> 
     <Code> sbo </Code> 
     <Actions1> Log;Stack;FullDump </Actions1> 
     <!-- Depending on what you intend - either stop the debugger (Q or QQ) or continue unhandled (GN) --> 
     <ReturnAction1> GN </ReturnAction1> 
    </Config> 
    </Exceptions> 
</ADPlus> 

Và bằng cách sử dụng lệnh sau đây :

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

Tôi đã xác minh rằng tệp nhật ký đã xuất ra chỉ định cấu hình phù hợp. Bí quyết là các tham số dòng lệnh của adplus được thực hiện theo thứ tự, vì vậy nếu bạn bắt đầu với một cấu hình bẫy các ngoại lệ đầu tiên-cơ hội và sau đó áp dụng -NoDumpOnFirst, các thiết lập cấu hình sẽ bị ghi đè. Nếu bạn áp dụng các cấu hình với -c cuối cùng, sau đó cài đặt của nó sẽ giành chiến thắng.

Cuối cùng, ngăn xếp ngăn xếp đã chứng minh là không thể sửa được. Sự tràn ngăn xếp xảy ra, không thể nhận được kết xuất bộ nhớ, và sau đó một kết xuất xảy ra trong quá trình kết thúc cơ hội thứ hai, và một lần nữa mọi thứ đã được thu thập rác và tôi không thể nhận được bất kỳ thông tin hữu ích nào.

Tôi đã cố gắng rút ngắn quá trình kết thúc ngoại lệ, trong trường hợp đó đã hấp dẫn và ghi đè tràn ngăn xếp, nhưng sau đó ngoại lệ xảy ra và tôi không có kết xuất bộ nhớ.

May mắn thay, tôi tình cờ gặp câu trả lời bằng cách kiểm tra mã. Đó là một trường hợp gọi phương pháp vòng tròn, tất nhiên.

Nghị quyết thực tế

Vấn đề đã được giải quyết từ lâu nhưng tôi nhanh chóng ra một trang ASP.NET có thể gây ra một chồng tràn. (Nó không phải là khó để làm sau khi tất cả) và đã thử phản ứng của Axl dưới đây.

XML hơi bị tắt - Axl chỉ quên đóng thẻ </ADPlus> (hoặc bị mất trong một bản sao), nhưng điều đó đủ dễ sửa và adplus đủ tốt để cho tôi biết chính xác những gì đã xảy ra.

Tôi đặt tập lệnh đó ra khỏi trình đẩy tràn ngăn xếp thử nghiệm, tải kết quả trong windbg và khi tôi gọi! Clrstack Tôi nhận được một danh sách rất rõ ràng (và dài) về các phương thức gọi nhau theo vòng tròn. Điều này sẽ tìm thấy vấn đề ngay lập tức! Tôi sẽ giữ trang này được đánh dấu cho lần sau khi tràn ngăn xếp đến gõ cửa của tôi.

Trả lời

11

Chỉ trong trường hợp điều này có thể giúp người khác, dưới đây là tệp cấu hình ADPlus tôi đã đưa ra. Nhìn vào nó bây giờ, tôi không chắc chắn rằng runaway có bất kỳ tác dụng. Kèm theo khi một ứng dụng ASP.NET ném một StackOverflowException đang chạy, điều này sẽ tạo ra "cơ hội 1 StackOverflow đầy đủ" và "cơ hội 1 quá trình Shut Down đầy đủ" .dmp tập tin trong OutputDir quy định. Mở tệp đầu tiên với Windbg và chạy ".loadby sos mscorwks" theo sau là "! Clrstack" để xem điều gì có thể gây tràn ngăn xếp.

<ADPlus> 
<Settings> 
    <RunMode>CRASH</RunMode> 
    <OutputDir>C:\Dumps</OutputDir> 
    <ProcessName>w3wp.exe</ProcessName> 
</Settings> 
<Exceptions> 
    <Option>FullDumpOnFirstChance</Option> 
    <Option>MiniDumpOnSecondChance</Option> 
    <Option>NoDumpOnFirstChance</Option> 
    <Option>NoDumpOnSecondChance</Option> 
    <Config> 
     <Code>AllExceptions</Code> 
     <Actions1>Void</Actions1> 
     <Actions2>Void</Actions2> 
     <ReturnAction1>GN</ReturnAction1> 
     <ReturnAction2>GN</ReturnAction2> 
    </Config>  
    <Config> 
     <!-- 
     av = AccessViolation 
     ch = InvalidHandle 
     ii = IllegalInstruction 
     dz = IntegerDivide 
     c000008e = FloatingDivide 
     iov = IntegerOverflow 
     lsq = InvalidLockSequence 
     sov = StackOverflowException 
     eh = CPlusPlusEH 
     * = UnknownException 
     clr = NET_CLR 
     bpe = CONTRL_C_OR_Debug_Break 
     ld = DLL_Load 
     ud = DLL_UnLoad 
     epr = Process_Shut_Down 
     sbo = Stack_buffer_overflow 
     --> 
     <Code>sov;sbo</Code> 
     <Actions1>Log;Time;Stack;FullDump;EventLog</Actions1> 
     <CustomActions1>!runaway</CustomActions1> 
     <Actions2>Log;Time;Stack;FullDump;EventLog</Actions2> 
     <CustomActions2>!runaway</CustomActions2> 
     <!-- 
     G = go 
     GN = go unhandled exception 
     GH = go handled exception 
     Q = quit 
     QD = quit and detach 
     --> 
     <ReturnAction1>GN</ReturnAction1> 
     <ReturnAction2>GN</ReturnAction2> 
    </Config> 
    <Config> 
     <Code>clr</Code> 
     <Actions1>Void</Actions1> 
     <Actions2>Log;Time;Stack;FullDump;EventLog</Actions2> 
     <ReturnAction1>GN</ReturnAction1> 
     <ReturnAction2>GN</ReturnAction2> 
    </Config> 
    <Config> 
     <Code>epr</Code> 
     <Actions1>Log;Time;Stack;FullDump;EventLog</Actions1> 
     <Actions2>Void</Actions2> 
     <ReturnAction1>GN</ReturnAction1> 
     <ReturnAction2>GN</ReturnAction2> 
    </Config> 
</Exceptions> 
</ADPlus> 
+0

Chỉ cần cấu hình cần đóng thẻ ADPlus. –

+1

Thẻ adplus kết thúc ở đó khi bạn chỉnh sửa. Tôi đã nhầm lẫn với định dạng và nó hiển thị ngay bây giờ. – bkaid

+0

@Axl - Tôi đang cố gắng sử dụng ví dụ .cfg của bạn nhưng tôi có phiên bản ADPlus mới hơn (adplus.exe với phiên bản 6.1.7650.0, mặc dù .doc gọi nó là "7.0") và định dạng tệp dường như đã thay đổi rất nhiều . Bạn có bất kỳ ý tưởng làm thế nào để dịch sang định dạng mới? – Laurence

3
 
<ADPlus> 
    <!-- Add log entry, log faulting thread stack and dump full on first chance StackOverflow --> 
<Exceptions> 
    <Config> 
     <!-- This is for the stack buffer overflow exception --> 
     <!-- Use sov for stack overflow exception --> 
     <Code> sbo </Code> 
     <Actions1> Log;Stack;FullDump </Actions1> 
     <!-- Depending on what you intend - either stop the debugger (Q or QQ) or continue unhandled (GN) --> 
     <ReturnAction1> GN </ReturnAction1> 
    < Config> 
    </Exceptions> 
</ADPlus> 

Save rằng trong stackoverflow.cfg
Sau đó, bạn có thể đi:

adplus -c stackoverflow.cfg

Edit: cả SOVSBO được chồng ngoại lệ tràn. Tôi đoán người ta cần phải thử nghiệm với cả hai vì nó không phải là khá rõ ràng với tôi những gì sự khác biệt giữa hai là. (có thể sbo biểu thị lời gọi alloca() không hợp lệ?)