Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Удачи

Другие советы

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

Редактировать:Просто чтобы внести полную ясность.Windbg - это бесплатный автономный отладчик от Microsoft.Скомпилируйте ваши VB6 EXEs, библиотеки DLL и OCXS в машинный код с символами (создайте PDB-файлы), и вы сможете отлаживать ваше приложение ClickOnce.

Ключевой отрывок из блога:

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top