2011-07-06 35 views
7

Tôi đã có một loạt các minidumps được ghi lại trong thời gian chạy của một ứng dụng thông qua MiniDumpWriteDump. Các minidumps được tạo ra trên một máy tính với một phiên bản hệ điều hành khác với máy phát triển của tôi.Làm thế nào để trích xuất dấu vết ngăn xếp từ minidumps?

Bây giờ tôi đang cố gắng viết chương trình trích xuất các dấu vết ngăn xếp từ các minidumps, sử dụng dbghelp.dll. Tôi đang đi bộ MINIDUMP_MODULE_LIST và gọi cho SymLoadModule64, nhưng điều này không tải xuống pdbs (kernel32, vv) từ máy chủ biểu tượng công khai. Nếu tôi thêm "C: \ Windows \ System32" vào đường dẫn biểu tượng, nó sẽ tìm thấy các dll và tải xuống các ký hiệu, nhưng tất nhiên chúng không khớp với các dll từ minidump, do đó kết quả là vô ích.

Vậy làm cách nào để yêu cầu dbghelp.dll tải xuống và sử dụng đúng pdbs?

[sửa]

Tôi quên nói rằng SymLoadModule64 chỉ mất một tên tập tin và không có thông tin phiên bản/checksum, vì vậy rõ ràng với SymLoadModule64 một mình nó không thể cho dbghelp để tìm ra pdb để tải về.

Thông tin thực sự có sẵn trong MINIDUMP_MODULE_LIST nhưng tôi không biết cách chuyển nó trở lại API dbghelp.

Có SymLoadModuleEx có tham số bổ sung, nhưng tôi không có ý tưởng nếu đó là những gì tôi cần hoặc những gì tôi nên vượt qua cho các tham số bổ sung.

[sửa]

Không may mắn cho đến nay, mặc dù tôi đã nhận thấy có cũng dbgeng.dll phân phối cùng với dbghelp.dll trong SDK gỡ lỗi. MSDN trông khá tốt tài liệu và nói rằng nó là động cơ tương tự như sử dụng windbg. Có lẽ tôi có thể sử dụng nó để trích xuất các dấu vết ngăn xếp.

Nếu bất cứ ai có thể chỉ cho tôi một số giới thiệu về cách sử dụng dbgeng.dll để xử lý minidumps có lẽ sẽ giúp quá, như các tài liệu MSDN chỉ các thành phần riêng lẻ nhưng không làm thế nào họ làm việc cùng nhau.

+0

Bạn có thể biến bạn thành minidump quá nhỏ. Tinker với đối số DumpType. Đảm bảo rằng danh sách Mô-đun Debug + Windows + hiển thị đường dẫn DLL, phiên bản và dấu thời gian chính xác. –

+0

Không, đó không phải là một vấn đề, tôi có thể tải minidumps trong WinDbg tốt và nó tải PDBs một cách chính xác. Nó chỉ là tôi muốn tự động hóa việc thu hồi stack thay vì kiểm tra các bãi bằng tay trong WinDbg. – Zarat

+1

Nếu bạn muốn đi đường hack, bạn có thể chỉ cần truyền lệnh xuống ntsd và chụp đầu ra –

Trả lời

8

Chỉ trong trường hợp bất cứ ai khác muốn để tự động giải nén đống dấu vết từ bãi, đây là những gì tôi đã kết thúc thực hiện:

Giống như tôi đã đề cập trong bản cập nhật nó có thể sử dụng dbgeng.dll thay vì dbghelp.dll, mà dường như để sử dụng cùng một công cụ WinDbg. Sau khi một số thử nghiệm và lỗi đây là cách để có được một dấu vết stack tốt với cơ chế tải biểu tượng giống như WinDbg.

  • gọi DebugCreate để có được một thể hiện của động cơ debug
  • truy vấn cho IDebugClient4, IDebugControl4, IDebugSymbols3
  • IDebugSymbols3.SetSymbolOptions sử dụng để cấu hình như thế nào những biểu tượng được nạp (xem MSDN cho các tùy chọn WinDbg sử dụng)
  • sử dụng IDebugSymbols3.SetSymbolPath để đặt đường dẫn biểu tượng như bạn sẽ làm trong WinDbg
  • sử dụng IDebugClient4.OpenDumpFileWide để mở bãi chứa
  • sử dụng IDebugCo ntrol4.WaitForEvent đợi cho đến khi bãi chứa được tải
  • sử dụng IDebugSymbols3.SetScopeFromStoredEvent để chọn ngoại lệ được lưu trữ trong bãi chứa
  • sử dụng IDebugControl4.GetStackTrace để lấy vài cây rơm cuối cùng khung
  • IDebugClient4.SetOutputCallbacks sử dụng để đăng ký một người nghe nhận được giải mã stack trace
  • sử dụng IDebugControl4.OutputStackTrace để xử lý ngăn xếp khung
  • IDebugClient4.SetOutputCallbacks sử dụng để unregister callback
  • giải phóng các giao diện

Cuộc gọi đến WaitForEvent có vẻ quan trọng vì không có các cuộc gọi sau không trích xuất dấu vết ngăn xếp. Ngoài ra còn có vẻ như có một số rò rỉ bộ nhớ trong đó, không thể nói nếu đó là tôi không làm sạch đúng hoặc một cái gì đó bên trong dbgeng.dll, nhưng tôi chỉ có thể khởi động lại quá trình mỗi 20 bãi hoặc như vậy, vì vậy tôi không điều tra thêm.

0

Cách dễ dàng để tự động phân tích nhiều tệp kết xuất nhỏ là sử dụng các tập lệnh được viết bởi John Robbins trong bài viết của mình "Automating Analyzing Tons Of Minidump Files With WinDBG And PowerShell" (bạn có thể lấy code on GitHub).

Điều này là dễ dàng để tinh chỉnh để có nó thực hiện bất cứ lệnh WinDbg bạn muốn nó, nếu thiết lập mặc định là không đủ.

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