2010-10-18 11 views
7

Tôi đang cố gắng xác định lý do tại sao quy trình bị treo và đang tìm hiểu về các công cụ khác nhau như Process Explorer, Process MonitorWinDbg.Tôi có thể học WinDbg bằng cách nào? (re: quá trình treo dường như đơn giản)

Dù sao, tôi đang cố gắng để sử dụng WinDbg và sau khi gắn liền với quá trình của tôi, debugger nói điều này:

(1e9c.1128): Break instruction exception - code 80000003 (first chance) 
eax=7ffda000 ebx=00000000 ecx=00000000 edx=77c5c964 esi=00000000 edi=00000000 
eip=77c18b2e esp=0543ff5c ebp=0543ff88 iopl=0   nv up ei pl zr na pe nc 
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000    efl=00000246 
ntdll!DbgBreakPoint: 
77c18b2e cc    int  3 

Nếu tôi chạy !analyze -v, nó sẽ hiển thị này:

FAULTING_IP: 
ntdll!DbgBreakPoint+0 
77c18b2e cc    int  3 

tôi m một nhà phát triển phần mềm (VB.NET/C#) không có kinh nghiệm ở cấp độ gỡ lỗi này, vì vậy tôi không chắc mình đang làm gì, nhưng có vẻ như WinDbg đang gắn vào quá trình của tôi và sau đó ngay lập tức phá vỡ. Sau đó, khi tôi làm một phân tích nó nghĩ rằng điểm ngắt (mà nó chỉ cần thiết lập) là vấn đề với các ứng dụng?

Làm cách nào để sử dụng WinDbg để chỉ cần đính kèm vào một quy trình và phân tích nó?

(Ngoài ra, là có bất kỳ cuốn sách tốt/hướng dẫn để bắt đầu với mức độ gỡ lỗi và WinDbg?) Viết blog

Trả lời

9

WinDbg là trình gỡ lỗi chế độ người dùng và hạt nhân, nhưng trên thực tế nó không thực sự hiểu mã được quản lý và do đó lệnh !analyze bị hạn chế sử dụng. Nếu bạn muốn gỡ lỗi các ứng dụng được quản lý bằng WinDbg, bạn cần một số cách để làm cho WinDbg hiểu cấu trúc nội bộ của mã được quản lý. Có một số DLL mở rộng cho phép điều này. .NET framework có sos.dll và có các tải xuống như psscor2.dllsosex.dll.

SOS và PSSCOR2 cung cấp nhiều hoặc ít tính năng tương tự trong khi SOSEX thêm các tính năng mới để gỡ lỗi được quản lý. Các tệp trợ giúp cho mỗi tệp trong số này có sẵn từ việc sử dụng WinDbg. Ví dụ. để nhận trợ giúp cho SOS, bạn có thể sử dụng lệnh !sos.help.

Bạn phải tải SOS hoặc PSSCOR2 và có thể SOSEX để gỡ lỗi ứng dụng được quản lý bằng WinDbg. Ví dụ.nếu bạn muốn tải SOS bạn sử dụng lệnh tải như thế này

.loadby sos clr

này sẽ được tải SOS từ vị trí của bộ thực thi .NET. Xin lưu ý rằng thời gian chạy được gọi là mscorwks trong .NET 2 và coreclr trong Silverlight, vì vậy nếu bạn đang sử dụng một trong hai cách này, bạn cần phải thay đổi lệnh .loadby tương ứng.

WinDbg cần ký hiệu để hiển thị thông tin bổ sung. Điều này đặc biệt quan trọng đối với mã không được quản lý. Bạn có thể sử dụng lệnh .symfix để cho phép WinDbg truy xuất biểu tượng khi cần từ máy chủ biểu tượng của Microsoft.

Khi ứng dụng của bạn bị treo, có nhiều khả năng bạn sẽ có một hoặc nhiều chuỗi bị chặn. Bạn có thể xem chuỗi được quản lý bằng cách sử dụng lệnh !threads (hoặc chỉ !t). Trong .NET, các khóa đơn giản được thực hiện bên trong bằng cách sử dụng một cấu trúc được gọi là SyncBlocks. Bạn có thể xem chúng bằng cách sử dụng lệnh !syncblk. Nếu bạn đã tải SOSEX, lệnh !dlk có thể tự động phát hiện deadlocks.

Nếu bạn muốn biết thêm thông tin, có một vài cuốn sách và một số blog cần đọc.

Sách:

Blogs:

  • Tess' blog là rất tốt. Nó có nhiều hướng dẫn và phòng thí nghiệm bạn có thể sử dụng để thực hành.
  • Tom's blog cũng rất hữu ích.

Video:

  • tôi đã làm một bài thuyết trình về gỡ lỗi quản lý tại các trung tâm phát triển của Microsoft tại Đan Mạch. Video có sẵn trên Kênh p. Part 1part 2.
5

Tess Ferrandez' là một nguồn lực tuyệt vời cho .NET WinDbg vật liệu:

If broken it is, fix it you should

Mặc dù nhiều bài viết của cô ấy nhắm vào sự cố, lỗi treo và rò rỉ của IIS/ASP.NET, hầu hết các kỹ thuật có thể áp dụng cho tất cả các loại kịch bản.

+0

+1 Tess là tài nguyên tuyệt vời để gỡ lỗi cấp giới thiệu. – Mike

5

Advanced Windows Debugging sẽ là một khởi đầu tốt.

Khi Windbg gắn vào một quá trình, nó sẽ tiêm một luồng gọi là DbgBreakPoint. Đó là những gì bạn đang thấy. Bạn có thể sử dụng ~ để xem các chuỗi đang chạy và sau đó ~ n để chuyển sang một chuỗi khác. k sẽ cung cấp cho bạn một dấu vết ngăn xếp của các chủ đề hiện tại, mà sẽ cung cấp cho bạn một số ý tưởng của hang.

3

Lệnh int 3 (cc trong nhị phân) là một trong những cách gỡ rối đặt điểm ngắt trong ứng dụng. Lệnh này tạo ra một ngắt tạm dừng việc thực hiện chương trình và cung cấp cho trình gỡ rối một cơ hội để phản ứng với ngắt này. Bạn chỉ cần chọn tiếp tục thực hiện cho đến khi bạn đến nơi chương trình của bạn đang treo.