2009-02-17 41 views
5

Tôi có một ứng dụng đang khóa trên luồng GUI, và tôi đã sử dụng WinDbg, cùng với lệnh "! Clrstack" để nhận dấu vết ngăn xếp này, nhưng tôi không thể tìm ra nơi vấn đề là. Tất cả các phương pháp này trông giống như các phương pháp khung và không có phương pháp nào của tôi. Bất kì sự trợ giúp nào đều được đánh giá cao. Tôi xin lỗi vì những dòng dàiCần trợ giúp giải mã dấu vết ngăn xếp C#

OS Thread Id: 0x724 (0) 
ESP  EIP  
0012ec88 7c90e4f4 [HelperMethodFrame_1OBJ: 0012ec88] System.Threading.WaitHandle.WaitOneNative(Microsoft.Win32.SafeHandles.SafeWaitHandle, UInt32, Boolean, Boolean) 
0012ed34 792b687f System.Threading.WaitHandle.WaitOne(Int64, Boolean) 
0012ed50 792b6835 System.Threading.WaitHandle.WaitOne(Int32, Boolean) 
0012ed64 7b6f192f System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle) 
0012ed78 7ba2d0bb System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean) 
0012ee18 7b6f328c System.Windows.Forms.Control.Invoke(System.Delegate, System.Object[]) 
0012ee4c 7b920717 System.Windows.Forms.WindowsFormsSynchronizationContext.Send(System.Threading.SendOrPostCallback, System.Object) 
0012ee64 7a924102 Microsoft.Win32.SystemEvents+SystemEventInvokeInfo.Invoke(Boolean, System.Object[]) 
0012ee98 7a922833 Microsoft.Win32.SystemEvents.RaiseEvent(Boolean, System.Object, System.Object[]) 
0012eee4 7a923d2f Microsoft.Win32.SystemEvents.OnUserPreferenceChanged(Int32, IntPtr, IntPtr) 
0012ef04 7aa8f184 Microsoft.Win32.SystemEvents.WindowProc(IntPtr, Int32, IntPtr, IntPtr) 
0012ef08 003620a4 [InlinedCallFrame: 0012ef08] 
0012f0cc 7b1d8cce System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32, Int32, Int32) 
0012f168 7b1d8937 System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext) 
0012f1bc 7b1d8781 System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext) 
0012f1ec 7b195911 System.Windows.Forms.Application.Run(System.Windows.Forms.Form) 
0012f200 00eb0ebb WinForms1.Program.Main() 
0012f69c 79e71b4c [GCFrame: 0012f69c] 
+0

Bạn đang cố gắng sửa đổi đối tượng GUI từ chuỗi không sở hữu? Nếu vậy bạn có thể chạy vào vấn đề InvokeRequired. –

+0

Theo như tôi biết tôi không thực hiện bất kỳ thao tác chéo nào. Tôi nghĩ rằng tôi sẽ có một đánh giá mã mở rộng để theo dõi điều này. –

+0

Nếu bất kỳ ai đọc chủ đề này đang xử lý vấn đề này liên tục, một cách để buộc một repro là thiết lập một biến môi trường trong một vòng lặp. Đây là một tệp mẫu .cmd đặt một biến môi trường toàn hệ thống mỗi ~ 5 giây: mã: top setx.exe foo thanh ping.exe -n 5 localhost> nul goto top – JohnW

Trả lời

8

Có vẻ như mã này không phải là nguyên nhân thực sự gây ra sự cố. Xem nếu một trong các trang này sẽ giúp:

Cập nhật: Cố định url trang đầu tiên.

+0

Các liên kết hữu ích, mọi sự phát triển cho .net 3.x? –

+0

Tôi mong đợi .Net 3.x hoạt động giống như .Net 2.0 trong trường hợp này vì các DLL lõi là như nhau. – David

+0

Tôi khá chắc chắn đây là vấn đề ... bây giờ nó chỉ là một vấn đề theo dõi xuống kiểm soát vi phạm đang được tạo ra trên thread sai bằng cách nào đó. –

1

Tôi gặp sự cố tương tự và đã tìm ra thủ phạm trong mã của chúng tôi.

Kỹ thuật sử dụng: 0. Hãy chắc chắn rằng trong Spy ++ mà chỉ có hai chủ đề không được quản lý với các điều khiển trên chúng (WinForms và GDI +):

public static class ThreadingHelper_NativeMethods 
{ 
    [DllImport("user32.dll")] 
    public static extern bool IsGUIThread(bool bConvert); 
} 

cuộc gọi này từ thread UI khi init:

// This code forces initialization of .NET BroadcastEventWindow to the UI thread. 
// http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/fb267827-1765-4bd9-ae2f-0abbd5a2ae22 
if (ThreadingHelper_NativeMethods.IsGUIThread(false)) 
{ 
    Microsoft.Win32.SystemEvents.InvokeOnEventsThread(new MethodInvoker(delegate() 
    { 
    int x = 0; 
    })); 
} 
  1. Nhớ id được quản lý của chuỗi Ui trong một lớp đơn.

  2. Tìm kiếm tất cả UserControl được xác định trong mã của chúng tôi. Trong mỗi hàm tạo của điều khiển, trước khi gọi InitializeComponent(), tôi đã đặt mã để kiểm tra id luồng hiện tại dựa vào id luồng chính. Nếu chúng không bằng nhau, Assert (sai).

  3. Đăng ký SystemEvents.UserPreferencesChanging. Debug.Assert (false) trong trình xử lý: điều này xảy ra trước SystemEvents.UserPreferencesChanged, vì vậy trình gỡ lỗi hy vọng sẽ tạm dừng ở đây.

  4. Kiểm tra danh sách người đăng ký với SystemEvents trong trình gỡ lỗi. Tìm người đăng ký trong từ điển _handles của danh sách. Mở SynchronizationContext của mỗi callback sẽ tiết lộ vấn đề: cùng một id thread như cho điều khiển được tạo ra trên thread không phải UI. SystemEvents sẽ thực hiện xử lý sự kiện trên chuỗi đó, bế tắc đối với luồng UI.

+0

Mẹo tuyệt vời - cảm ơn! –

3

Câu trả lời khác đến từ Aaron Lerch này. Tôi thực sự thích phần "điểm ngắt được lọc trên mã của người khác". Tôi nghĩ nó sẽ cứu tôi vài ngày.

http://www.aaronlerch.com/blog/2008/12/15/debugging-ui/

+0

Tôi đã có (và tiếp tục có) may mắn khá tốt với nó, ở mức nào. ;) –

Các vấn đề liên quan