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 ~
và !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?
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
Theo như tôi biết, tất cả các đối tượng COM VB6 là của chúng ta. –
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