2009-11-05 59 views
5

Dịch vụ C# của tôi nhận được lỗi thực thi nội bộ .net trỏ đến vấn đề đệ quy (ví dụ: tràn ngăn xếp). Vấn đề là dịch vụ là khá lớn, vì vậy tôi gặp khó khăn trong việc tìm kiếm nơi đệ quy thực sự xảy ra.Cách tìm đệ quy trong ứng dụng của bạn?

Có thể ai đó với moex regex khổng lồ đã kết nối tôi bằng chuỗi tìm kiếm có thể tìm thấy những gì tôi cần không?

+0

Không theo dõi ngăn xếp? –

+0

Không, lý do duy nhất tôi thậm chí biết rằng ứng dụng bị lỗi là có một mục trong Nhật ký sự kiện thông báo rằng một lỗi khung nội bộ .net đã xảy ra và cung cấp mã, mà tôi truy tìm các vấn đề tràn ngăn xếp. – AngryHacker

+1

Bạn đã bao giờ tìm thấy sự cố này chưa? Nếu thế thì sao?Tôi nghĩ rằng hầu hết mọi người ở đây không hiểu rằng chương trình bị treo mà không đăng nhập ở tất cả ngoại trừ lỗi tràn ngăn xếp chung trong Nhật ký sự kiện dịch vụ. –

Trả lời

5

Một đệ quy là không dễ dàng để tìm thấy trong một số tình huống như:

method1() { 
    method2() 
} 

method2() { 
    method1() 
} 

Vì vậy, một regex có lẽ sẽ không giúp bạn tìm thấy nó trừ khi nó là một trường hợp tầm thường.

+1

Đúng. Xây dựng biểu đồ cuộc gọi và tìm chu kỳ. – ephemient

+0

Và hy vọng không có lời gọi lại hệ điều hành nào liên quan đến đệ quy;) – Cogwheel

4

Cách sử dụng công cụ lược tả như RedGate's Ants profiler hoặc dotTrace?

Cả hai đều cung cấp bản dùng thử miễn phí. Chỉ cần chạy mã với trình chạy hồ sơ và nó sẽ nhanh chóng cho bạn thấy nơi mà thời gian/bộ nhớ của bạn đang được chi tiêu.

Tôi muốn đặt cược rằng chức năng đệ quy của bạn sẽ bị lỗi một chút.

Ngoài ra, bạn đang sử dụng khung khai thác lỗi nào? Trong trường hợp câu trả lời là không, hãy xem xét việc áp dụng câu trả lời. This Question deals with the options. Với một hệ thống tốt, bạn sẽ có thể nhận được dấu vết ngăn xếp, nếu bạn may mắn, có thể cung cấp cho bạn manh mối về trường hợp ngoại lệ xảy ra.

+0

Tôi có hàng trăm cài đặt ở Hoa Kỳ, đây là trường hợp duy nhất cho tôi phù hợp. Tôi không thể tái tạo vấn đề, nhưng tôi muốn ít nhất là gần với nó, bằng cách định vị đệ quy – AngryHacker

6

Đây là câu hỏi không thể trả lời trong trường hợp chung. Ngoại trừ các ví dụ nhỏ nhất (ví dụ: một hàm tự gọi trực tiếp), không có cách nào để phân tích chương trình và xác định xem có xảy ra đệ quy hay không. Bạn sẽ chỉ cần bắt đầu nhấn trình gỡ lỗi hoặc các công cụ thời gian chạy khác.

Đây là ví dụ về số halting problem.

+1

Có - Rất đúng. Tuy nhiên, các dịch vụ gỡ lỗi phức tạp hơn các ứng dụng bình thường, đó có thể là lý do tại sao chúng yêu cầu. –

+0

Tôi nghĩ rằng bạn đang phóng đại nó một chút. Trong hầu hết trường hợp, tôi nghĩ rằng một số phân tích tĩnh tìm thấy một số chu kỳ - điều này sẽ không được khó khăn. Nó có đầy đủ không? Không, nhưng tôi nghĩ để thực hiện một kiểm tra thực tế cho điều này sẽ không được khó khăn như vậy. Sử dụng một regex sẽ không xảy ra mặc dù. – Tim

+1

Tôi nghĩ rằng "một số chu kỳ" phù hợp với "các ví dụ nhỏ nhất" mà tôi đã cố gắng vượt qua. Nhưng yeah, thậm chí sau đó bạn có thể sẽ cần một phân tích cú pháp đầy đủ chỉ để bắt đầu. – Cogwheel

2

Đính kèm với the service in the debugger và gỡ lỗi chính xác. Bạn sẽ tìm thấy điều này dễ dàng hơn nhiều so với cố gắng tìm kiếm mã của bất kỳ dự án có kích thước hợp lý nào.

4

Tôi đồng ý rằng regexp sẽ không cắt ở đây.

Cách trực tiếp hơn là lấy tệp kết xuất và xem tệp để xem vị trí ngoại lệ được ném.

Hoặc bạn có thể xem xét công cụ phân tích tĩnh như NDepend để kiểm tra luồng chương trình.

1

Cách dễ nhất để thực hiện việc này là lấy dấu vết ngăn xếp của sự cố đang bị lỗi. Theo dõi ngăn xếp sẽ trông giống như sau:

Blah 
Foo 
Baz 
Hello 
... 
Frob 
Frob 
Frob 
Frob 
[several hundred more Frobs] 
Frob 
Frob 
... 
Frob 
Something -- crash! 

"Frob" là hàm đệ quy. :-)