Как проверить 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
,