Сопоставление ассемблерного кода с кодом VB6

#debugging #assembly #vb6

#отладка #сборка #vb6

Вопрос:

Я работаю над устаревшим приложением VB6. В определенном варианте использования происходит сбой приложения с чем-то, что выглядит как исключение нулевого указателя:

Инструкция в «0x2982e900» ссылалась на память в «0x00000156». Не удалось «прочитать» память.

Я попытался выполнить некоторую отладку исходного кода, но не могу найти строку исходного кода, которая выдает исключение. Есть ли какой-либо способ найти строку исходного кода, которая соответствует адресу инструкции по сборке, такому как 0x2982e900? (Я пробовал Reflector, но, похоже, он поддерживает только .NET).

Обновить:

Когда я отлаживаю приложение с помощью VB6 IDE debugger, я не получаю никаких перерывов в исходном коде VB6. Вместо этого появляется упомянутое выше сообщение об ошибке Windows, дающее мне возможность включить отладчик Visual Studio 2010. Если я это сделаю, отладчик VS2010 отобразит ассемблерный код следующим образом:

[…]
2982E8FA нажимает eax
2982E8FB вызывает 29832E9B
2982E900 mov ax, word ptr [eax 156h]
[…]

Приложение использует некоторые файлы .ocx от компании Infragistics для реализации графического интерфейса. Согласно утилите CrashFinder, показанный ассемблерный код взят из файла IGTOOLBARS40.OCX .

Комментарии:

1. У вас есть исходный код приложения? (Похоже, что вы должны, поскольку вы говорите, что «работаете» над приложением.) Если это так, попробуйте запустить его из среды разработки VB 6, чтобы был подключен встроенный отладчик. Это должно перехватить ошибку до того, как это сделает Windows, и, по крайней мере, сообщить о строке, которая вызывает проблему. Обновление вашего вопроса здесь этой строкой должно дать вам несколько быстрых идей о том, как это исправить.

Ответ №1:

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

Проблема, скорее всего, вызвана либо

  • Ошибка в DLL или OCX (возможно, сторонняя?)
  • Ошибка при вызове Windows API. Чаще всего с помощью Declare инструкции, иногда с помощью библиотеки типов (аппаратной!).

Первым шагом является определение того, какая строка кода VB6 вызывает сбой.

Либо:

  • Работайте с IDE, пока не произойдет сбой.
  • Или расшифруйте 0x2982e900 адрес в исходный номер строки VB6 с помощью CrashFinder. Вы всегда создаете свой EXE-файл с помощью PDB-файла, который содержит символы отладки, верно?

    Чтобы указать интегрированной среде разработки VB6 создать проект с отладочной информацией, вам необходимо изменить один из параметров компиляции по умолчанию. В меню Файл выберите «Построить Project1.exe «. Нажмите кнопку «Параметры» в появившемся диалоговом окне сохранения файла, и откроется таблица свойств. Перейдите на вкладку «Компиляция» и установите флажок с надписью «Создать символьную отладочную информацию».

     Убедитесь, что в настройках сборки установлен флажок quot;Создать символьную информацию отладкиquot;

Комментарии:

1. извините за мое невежество, но что такое PDB и как бы я скомпилировал свой исполняемый файл с одним (то есть VB6)?

2. @Brian: Обновил ответ дополнительной информацией о PDF-файлах и их генерации из VB6. Это, безусловно, эффективный путь обнаружения, но я думаю, что намного проще пошагово просмотреть код, используя VB6 IDE, чтобы увидеть, какая строка является некорректной. Переход по символам отладки сложен для среднего программиста на VB, и я предполагаю, почему эта опция отключена по умолчанию.

3. @Cody, @MarkJ, спасибо за это. Я думаю, вы правы в том, что предпочтительнее пошагово выполнять код в IDE, но никогда не помешает попробовать другие вещи.

4. @Cody @Brian Спасибо за отличную правку, Коди! Будет проще пошагово выполнять код в IDE, если это возможно. PDB может быть спасением, если у вас произошел сбой, который происходит только на компьютере клиента, и вы не можете запустить IDE.

5. Я бы отключил оптимизацию, если PDB будет использоваться для пошагового выполнения кода в VC (или другом) отладчике.

Ответ №2:

Вы можете попробовать обратный инжиниринг приложения с помощью дизассемблера, такого как IDA Pro.