Как я могу отладить элемент управления ActiveX (OCX) или заставить его регистрировать ошибки?

В настоящее время я работаю с довольно старым приложением Borland C ++, которое использует компонент ActiveX для рисования графики. В приложении несколько окон с ActiveX комп. может быть открыт в любое время — они могут показывать одну и ту же графику (с разным коэффициентом масштабирования и т. д.) или другую графику.

Приложение для позиционирования, а ActiveX рисует и показывает позиции разных юнитов.

Примерно 10 раз в секунду приложение Borland получало новую позицию и выясняет, какие формы (и их ActiveX) нужно знать об обновленной позиции, чтобы нарисовать ее. Это продолжалось хорошо в течение долгого времени, но мне пришлось внести некоторые изменения в ActiveX для новой версии продукта.

Около года назад мне пришлось также внести некоторые незначительные изменения в компонент, и я обнаружил, что приложение может завершить работу в состоянии, в результате чего в компоненте произошла ошибка «индекс вне границ». Результатом этого было не появление ошибки или прекращение работы программы, а приложение стало использовать огромное количество памяти и продолжало расти очень быстро. В какой-то момент он остановился, и компонент, у которого была ошибка, просто перестал показывать что-либо (перестал рисовать сам)

Теперь с недавними изменениями, которые я сделал, у меня возникла та же проблема, когда один из компонентов, кажется, получает ошибку, которая не отображается, и вместо этого он сам не перерисовывается, а использование памяти становится невероятно высоким. На некоторых компьютерах кажется, что выброшено нарушение прав доступа — это говорит о том, что ошибка произошла в OCX, но на компьютере, на котором я работаю, я никак не могу получить это нарушение прав доступа.

Также я не могу точно отследить, когда произошла ошибка — то есть, что является причиной ошибки. Я могу запустить одну и ту же настройку 10 раз подряд в течение 15 минут, иногда случается, что использование памяти увеличивается, и возникает ошибка компонента, в других случаях ничего не происходит, и он работает так, как и должно быть в течение всей продолжительности.

Поскольку это OCX, он регистрируется с помощью regsvr32 и, следовательно, по коду не является частью основного приложения. Поэтому я не могу использовать точки останова и отлаживать его таким образом.

Я уверен, что внутри компонента происходит какая-то ошибка, которая не передается, поэтому я не вижу, что это такое.

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

Любая помощь будет высоко ценится — пытался отследить ошибку в течение 3 дней безрезультатно, что когда-либо.

4

Решение

По сути, вы спрашиваете, как отладить DLL. OCX — это просто файл DLL, который загружается в процесс. Это довольно широкая тема, но я постараюсь дать краткое начало:

Файлы DLL / EXE / OCX обычно называются «модулями» в контексте программирования Windows. Все они в основном одно и то же. Я буду называть их здесь DLL, хотя просто для ясности.

Отладчики (Visual Studio и Borland являются как отладчиками, так и IDE) «прикрепляются» как паразиты к процессам, позволяя вам делать такие вещи, как установка точек останова, чтение памяти процесса, просмотр трассировки стека и т. Д. Они могут видеть / манипулировать всей памятью & ресурсы для этого процесса, включая все библиотеки DLL.

DLL не содержат много информации, чтобы помочь отладчикам, даже в отладочной сборке. Они в основном содержат двоичный машинный код, и если вы перейдете к вызову DLL с помощью отладчика, вы сможете увидеть только код сборки, а не исходный код. Функции — это просто адреса в памяти, локальные переменные даже не видны; Вы только получаете некоторые указатели в памяти стека.

Файлы PDB («база данных программы») содержат всю дополнительную информацию и метаданные, которые отладчик может выполнять, например, отображение адресов в памяти на строки исходного кода, локальные переменные, типы данных, сигнатуры функций и т. Д. Эта информация называется «символами отладки». или просто «символы». Когда Visual Studio создает DLL, она выводит соответствующий файл PDB. Именно этот PDB-файл позволяет реализовать всю магию: пройтись по исходному коду в отладчике, просмотреть локальные переменные, правильно просмотреть типы данных в окне просмотра.

Когда отладчик Visual Studio подключен к процессу и видит загружаемую DLL, он ищет соответствующий ему файл PDB. Он ищет это в нескольких местах, самое простое из которых находится в той же папке, что и DLL. Так что, если вы загрузили C:\something\myctl.ocxбудет искать C:\something\myctl.pdb, Если он может найти его, он будет использовать его, и вы можете отлаживать DLL с расширенной поддержкой отладчика. Если он не может найти его, вы будете там, где вы сейчас находитесь — где вызовы DLL — это черный ящик, в который вы не можете заглянуть.

Microsoft даже предоставляет файлы PDB для Windows DLL, такие как ntdll.dll, Они должны быть загружены по мере необходимости. Visual Studio может сделать это автоматически, перейдя в Tools -> Options -> Debugging -> Symbols и должна быть возможность использовать серверы Microsoft Symbol для автоматической загрузки отсутствующих файлов символов.

Небольшой пример, чтобы направить вас в правильном направлении:

Допустим, вы написали OCX под названием myctl.ocx сбой при добавлении в документ Wordpad. Способ отладки это подключить отладчик к wordpad.exe, В Visual Studio это Debug -> Attach to Process Я верю. Когда он подключен, вы даже можете увидеть в окне вывода:

'wordpad.exe': Loaded 'C:\Program Files\Windows NT\Accessories\wordpad.exe', Symbols loaded (source information stripped).
'wordpad.exe': Loaded 'C:\Windows\System32\ntdll.dll', Symbols loaded (source information stripped).
'wordpad.exe': Loaded 'C:\Windows\System32\kernel32.dll', Symbols loaded (source information stripped).
'wordpad.exe': Loaded 'C:\Windows\System32\KernelBase.dll', Symbols loaded (source information stripped).
...

Вы можете увидеть, как Visual Studio загружает файлы PDB (файлы символов), которые предоставляют для них немного дополнительной информации. Когда вы загружаете myctl.ocxВы также увидите эту строку. Если myctl.pdb доступно, это также загрузит.

'wordpad.exe': Loaded 'C:\something\myctl.ocx', Symbols loaded.

С этим вы можете отлаживать что угодно в myctl.ocx с исходным кодом и все. Когда Wordpad падает внутри myctl.ocx, он должен показать вам исходный код и все, опять же, предполагая, что он находится в доступном месте.

9

Другие решения

Добавьте код в OCX, который открывает файл и печатает, что происходит, возможно, с отметкой времени. Содержимое журнала может включать поток выполнения, входные значения, значения критических переменных, важное внутреннее состояние.

По крайней мере, так я бы подошел.

1

Как отлаживать OCX / C ++ в IE.10 + WIN8 64bit + VS2008

  • Создайте свой ocx в vs2008, добавьте тег ocx CSID в ваш HTML.
  • Держите TabProcGrowth с Medium (не меняется !!)
  • Настройка VS2008 OCX проекта Отладка с помощью команды C:\Program Files (x86)\Internet Explorer\iexplore.exe,Attach = Yes,Debugger Type=Native Only
  • Откройте Internet Explore 10 из панели задач WIN8.
  • введите путь к целевому ocx htm-файлу в URL-адресе Internet Explorer 10. и нажмите клавишу ввода, чтобы загрузить htm.
  • ocx загружен, и вам нужно включить режим IEX ActiveX.
  • Когда IE10 будет готов к работе в режиме ActiveX, запустите проект VS2008 OCX, который подключит IE10 с вашей точкой останова.
  • Снова обновите IE.10 html, чтобы перезагрузить ocx и начать отладку исходного кода ocx.
1