Как проверить COM-объекты из файла дампа Visual Basic?

Фон

У нас есть приложение.NET WinForms, написанное на C#, которое подключается к портативному сканеру магазина через консольное приложение. Консольное приложение написано на хорошем старом VB6- там нет управляемого кода. Приложение VB6 состоит из нескольких объектов COM.

Приложение.NET WinForms обновляет данные в сканере, вызывая консольное приложение с правильными параметрами. Когда консольное приложение запускается, оно вызывает модальную форму, напоминающую пользователю о необходимости поместить портативное устройство в его подставку.

проблема

У клиента странная ситуация, когда вызов для запуска консольного приложения зависает до того, как отобразится форма напоминания. Если пользователь нажимает любую клавишу - даже что-то невинное, например, Shift или Alt - приложение размораживается, и появляется форма напоминания. В то время как он зависает, загрузка ЦП консольного приложения очень высока.

Мы получили дамп памяти из приложения командной строки, используя ProcDump. У меня есть некоторый опыт отладки управляемых файлов дампа, но этот дамп VB 6 для меня странен.

Мы захватили несколько полных дампов памяти подряд. В некоторых из них, кажется, есть стеки клея COM. Например, несколько файлов дампа показывают стек вызовов как это:

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]

Не помогает, что единственные символы, которые у меня есть, взяты из нашего кода. Сервер символов Microsoft не имеет файла PDB для msvbm60.dll (или, по крайней мере, не из их версии 6.0.98.2).

Вопросы

Я подозреваю, что может быть некоторая проблема с потоками COM, которая происходит только в их системе.

1) Как определить состояние каждого потока в файле дампа? Если бы это был файл управляемого дампа, я бы посмотрел на !threads а потом !threadstate выяснить состояния потоков. Управляемого кода нет, поэтому я не могу использовать sos.dll. Я не видел никаких подсказок, используя ~ а также !teb,

2) Есть ли способ увидеть, какие COM-объекты были созданы в файле дампа? Опять же, в управляемом дампе я могу сделать !dumpheap получить список управляемых объектов. Есть ли что-то похожее, что я могу найти для COM-объектов?

3) Можно ли определить модель потоков COM-объектов в файле дампа?

2 ответа

Вы можете вывести состояние потока с помощью команды:

~*

это не будет отображать "фон" как состояние, вы будете видеть только запущенный, замороженный или приостановленный.

Я не уверен, как вы можете получить информацию от COM-объектов, я никогда не пытался, но буду исследовать и вернуться к вам, что касается модели потоков, то будет трудно сделать вывод, что без болезненного мониторинга состояния приложения после перехода и даже с что, когда вы проходите через все другие потоки, будут работать, если вы не используете .bpsync 1 который синхронизирует все потоки с текущим, но это может привести к зависанию (например, потоку графического интерфейса теперь приказано зависнуть), поэтому я думаю, что это будет трудно, если у вас нет доступа к исходному коду.

Я могу ответить только на вопрос 1. Используйте !runaway найти поток или потоки, потребляющие процессор. Для получения всех стеков потоков используйте ~*kb1000,

Другие вопросы по тегам