Удаленная отладка в VB6 - PullRequest
       27

Удаленная отладка в VB6

9 голосов
/ 06 февраля 2009

Можно ли удаленно отлаживать процесс, запущенный вне VB6?

Приложение представляет собой приложение VB6 с довольно большим количеством ресурсов dll / ocx. Я пытаюсь настроить развертывание ClickOnce с использованием COM без регистрации для приложения VB6, но при его выполнении возникают ошибки.

Мое понимание того, как VB6 перенаправляет регистрацию COM, вероятно, будет означать, что это невозможно, но я подумал, что у кого-то может быть идея получше.

Ответы [ 3 ]

9 голосов
/ 06 февраля 2009

В поддержку ответа Дэррила, предлагающего Windbg - вот блог 2006 от парня из Microsoft об использовании Windbg с VB6 и 2004 блог * от 1006 * от другой Microsoft парень с кратким знакомством с Windbg.

РЕДАКТИРОВАТЬ: Просто чтобы сделать это совершенно ясно. Windbg - это бесплатный автономный отладчик от Microsoft. Скомпилируйте свои VB6 EXE, DLL и OCX в нативный код с символами (создавайте файлы PDB), и вы сможете отлаживать приложение ClickOnce.

Ключевая выдержка из блога:

Если у вас ограниченный доступ к серверу, вы можете использовать средства удаленной отладки WinDbg. Прикрепите копию WinDbg к обработать обычным способом, а затем включить его на сервер отладки (проверьте .server в справке WinDbg). Вы можете подключиться к нему удаленно из меню «Файл» WinDbg. Это будет так же, как там кроме отсутствия шума от поклонников серверной комнаты. когда отладка пульта, ваша копия WinDbg просто очень умный терминал поэтому все расширения, символы и т. д. должны находиться на удаленном сервере. Вы настраиваете это точно так же для любой DLL, VB6 или .NET.

Символы для вашего компонента не будут загружаться, пока ваш компонент не загрузится и поэтому вы должны позволить серверу по крайней мере так долго работать. Вы можете положить перерыв в начале кода VB, если вы хотите остановить отладчик в этот момент, но если вы это сделаете, помните, что он будет останавливаться там каждый раз через код. Давайте предположим, что вы позволили ему запустить, а затем взломать. Если вы перечислили загруженные символы для вашего модуля с помощью «x MyModule! *» тогда вы увидите все свои функции вместе с множеством символов в комплекте для вас. VB добавляет интерфейсы и символы довольно без стыда, но вам не нужно беспокоиться об этом. Один вещь, которая, вероятно, будет выглядеть странно, это то, что весь синтаксис класса / метода с соглашением о двойном двоеточии C ++ вместо дружелюбного точка. WinDbg не понимает, что VB отличается, и это лечится как любая DLL с символами.

Отсюда вы можете установить точки останова обычным способом (bp и т. Д.) И выполнить шаг через код. Вы также можете открыть модули исходного кода VB и установить точки останова в них с F9, хотя расширения файла VB не находятся в выпадающий тип исходного файла. Пошаговое выполнение кода показательно но может быть немного тревожным, если вы не видели код, который VB генерирует для вас раньше. Вы пройдете через ассемблер и там много COM Goo там. Нерешительность много проверяется. Вам, вероятно, придется часто обращаться к источнику, чтобы понять, где вы, так как требуется немного практики, чтобы узнать, что Исходный код был похож. Варианты особенно сложны, потому что VB проделывает большую работу для вас и выглядит просто Уравнение может привести к большому количеству кода. Оптимизированный код даже сложнее, потому что порядок исполнения часто сильно отличается от что вы можете ожидать, и это сложнее, чем обычно, чтобы увидеть данные.

Данные нелегко получить таким способом. Когда вы смотрите на локальные переменные (команда dv), тогда вы можете увидеть, что переменные просто перечислены затмевает, что означает, что память используется для чего-то а также в течение времени жизни функции или что имя не уникальный в этом контексте. Перечисления просто показывают как целые или длинные и объекты отображаются в виде указателей. На самом деле, они всегда были именно такими, но VB IDE скрывает это от вас. Строки VB являются COM BSTR (и соответственно Unicode) под обложками и байтовыми массивами действительно char массивы. Вы можете быть удивлены, обнаружив, что строки VB являются Unicode поскольку VB, кажется, не поддерживает ничего, кроме ANSI. То есть потому что движок форм Ruby был только ANSI. Среда выполнения преобразует Unicode-строки в ANSI для вызовов Ruby и API, хотя есть способы пройти Юникод, если хотите.

Вы не сможете получить объекты Err, App или Printer. так как вам нужно будет пройти через много внутренних и полностью недокументированные структуры, чтобы добраться до них. Даже если бы ты мог добраться туда, они будут просто необработанными данными без функций доступа, которые вы использовать в VB. Если вам нужно взглянуть на любое из этих полей, лучше всего это вставить код отладки в исходный код, чтобы скопировать их значения в где вы можете получить.

Вы можете войти во время выполнения VB, если хотите, но, вероятно, этого не произойдет. очень показательно, если вы пытаетесь отладить приложение. Если вы делаете, вы заметите, что внутренности VB очень сильно влияют на COM. влияние было на самом деле двояким, так как некоторые идеи COM пришли из VB первоначально.

Вы можете увидеть исключения при запуске вашего кода. Нулевая ссылка исключения (то есть разыменование нулевого указателя) не являются редкостью или о чем беспокоиться. Они появятся как первый шанс C000005 исключения с адресом 0 или почти 0. Время выполнения иногда будет делать что если есть объекты, установленные на ничего, но это безопасно, потому что только возможные значения являются нулевыми или допустимыми. Вы также увидите исключения, если ваш код выполняет поиск в коллекциях и значение не там. Поскольку исключения теперь так дороги, вы, вероятно, хотите чтобы избежать этого, если вы можете. Еще одно исключение, которое вы будете обычно видим это c000008f. Если вы посмотрите номер вверх, то вы найдете что это исключение неточного результата с плавающей запятой. Используется в другое значение здесь - так как мы не генерируем реальную плавающую точку неточные результаты исключений, их можно смело бросать для обозначения VB ошибки обычного трапбируемого типа.

Отладка зависаний и сбоев в компонентах VB выполняется очень так же, как с любым другим неуправляемым компонентом, но это немного сложнее из-за компиляций, описанных выше. Если вам нужно попробовать отладка кода VB таким образом, я настоятельно рекомендую вам начать на приложении "Hello world" и продолжайте свой путь. Все вещи это может VB простой язык для кодирования сделать его ужасным языком для отладки.

3 голосов
/ 06 февраля 2009

Вы пробовали windbg ? Просто убедитесь, что у вас есть файлы pdb для проекта.

3 голосов
/ 06 февраля 2009

Я считаю, что при отладке в VB6 он не подключается к работающему двоичному файлу, а интерпретирует код в своем собственном процессе. Вот почему диспетчер задач и интерфейсы Win32 API показывают отладчик VB6.exe как работающее приложение при отладке.

Также, как вы говорите, VB6 иногда замыкает вызовы в COM-библиотеки, поэтому перехват этих вызовов не всегда возможен.

Вероятно, вам придется прибегнуть к интеллектуальному ведению журнала (т.е. записать значения переменных вокруг точек, в которых возникают ошибки, в надежде найти строку кода, в которой она возникает, и / или состояние соответствующих переменных.)

Удачи

...