2012-05-16 17 views
5

Bối cảnhLàm thế nào để kiểm tra đối tượng COM từ tập tin Dump Visual Basic?

Chúng tôi có ứng dụng .NET WinForms được viết bằng C# giao diện với máy quét cửa hàng cầm tay thông qua ứng dụng bảng điều khiển. Ứng dụng giao diện điều khiển được viết bằng VB6 'ol' tốt - không có mã được quản lý ở đó. Ứng dụng VB6 bao gồm một số đối tượng COM.

Ứng dụng .NET WinForms làm mới dữ liệu trong máy quét bằng cách gọi ứng dụng bảng điều khiển với thông số phù hợp. Khi ứng dụng giao diện điều khiển khởi động, nó bật lên một biểu mẫu nhắc nhở người dùng đặt thiết bị cầm tay vào giá đỡ của nó.

Vấn đề

Một khách hàng có một tình huống kỳ lạ, trong đó kêu gọi khởi động ứng dụng giao diện điều khiển dường như treo trước nó sẽ hiển thị dưới dạng nhắc nhở. Nếu người dùng nhấn bất kỳ phím nào-- ngay cả một cái gì đó vô tội như Shift hoặc Alt-- ứng dụng sẽ không hoạt động và biểu mẫu lời nhắc sẽ xuất hiện. Trong khi nó được treo, việc sử dụng CPU của ứng dụng giao diện điều khiển là rất cao.

Chúng tôi đã nhận được kết xuất bộ nhớ từ ứng dụng dòng lệnh bằng cách sử dụng ProcDump. Tôi có một số kinh nghiệm gỡ lỗi các tập tin dump quản lý, nhưng điều này VB 6 dump là lạ với tôi.

Chúng tôi đã chụp được một vài vùng bộ nhớ đầy đủ liên tiếp. Trong một số người trong số họ, có vẻ là ngăn xếp keo COM. Ví dụ: một số tệp kết xuất hiển thị một ngăn xếp cuộc gọi như sau:

msvbm60!BASIC_DISPINTERFACE_GetTICount 
msvbm60!_vbaStrToAnsi 
msvbm60!IIDIVbaHost 
msvbm60!rtcDoEvents 
msvbm60!IIDIVbaHost 
msvbm60!BASICCLASS_QueryInterface 
[our code which I think is trying to create and invoke a COM object] 

Nó không giúp các ký hiệu duy nhất tôi có được từ mã của chúng tôi. Máy chủ biểu tượng của Microsoft không có tệp PDB cho msvbm60.dll (hoặc ít nhất không phải từ phiên bản của chúng là 6.0.98.2).

Câu hỏi

Tôi nghi ngờ có thể có một số luồng vấn đề COM đang xảy ra chỉ trên hệ thống của họ.

1) Làm cách nào để xác định trạng thái luồng của từng chuỗi trong tệp kết xuất? Nếu đây là tệp kết xuất được quản lý, tôi sẽ xem !threads và sau đó !threadstate để tìm ra trạng thái luồng. Không có mã được quản lý, vì vậy tôi không thể sử dụng sos.dll. Tôi không thấy bất kỳ gợi ý nào sử dụng ~!teb.

2) Có cách nào để xem đối tượng COM nào đã được tạo trong tệp kết xuất không? Một lần nữa, trong một bãi chứa được quản lý, tôi có thể làm một !dumpheap để có được một danh sách các đối tượng được quản lý. Có một cái gì đó tương tự như tôi có thể tìm thấy đối tượng COM?

3) Tôi có thể xác định mô hình luồng của đối tượng COM trong tệp kết xuất không?

+0

Có phải tất cả VB6 của bạn, hoặc bạn đang gọi các đối tượng COM của bên thứ ba không? – tcarvin

+0

Theo như tôi biết, tất cả các đối tượng COM VB6 là của chúng ta. –

+0

Sau đó, tôi nghĩ rằng xem các chủ đề sẽ không yeild tất cả những gì nhiều cho rằng VB6 không hỗ trợ đa luồng. Gần nhất nó đến là trong các máy chủ ActiveX hỗ trợ nhiều STA bị cô lập (đơn luồng căn hộ). – tcarvin

Trả lời

1

Tôi chỉ có thể trả lời câu hỏi 1. Sử dụng !runaway để tìm chủ đề hoặc chủ đề tiêu thụ CPU. Để nhận tất cả các ngăn xếp chuỗi sử dụng ~*kb1000.

+0

Tôi cũng muốn xem thông tin trạng thái luồng. Trạng thái chủ đề như trong "nền" hoặc "đang chạy" hoặc "chấm dứt". –

2

Bạn có thể đổ nhà nước chủ đề bằng cách sử dụng lệnh:

~* 

này sẽ không hiển thị 'nền' như một trạng thái, bạn sẽ chỉ thấy chạy, đông lạnh hoặc bị treo.

Tôi không chắc cách bạn có thể lấy thông tin từ đối tượng COM, tôi chưa bao giờ thử nhưng sẽ điều tra và lấy lại cho bạn, liên quan đến mô hình luồng, sẽ rất khó để suy ra điều đó. thông qua và thậm chí với điều đó, khi bạn duyệt qua tất cả các chủ đề khác sẽ chạy trừ khi bạn sử dụng .bpsync 1 đồng bộ tất cả chuỗi với chuỗi hiện tại, nhưng điều đó có thể gây treo (ví dụ: chuỗi gui hiện đã bị đóng băng) vì vậy tôi nghĩ nó sẽ khó khăn trừ khi bạn có quyền truy cập vào mã nguồn.