Отладка приложений

         

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


Теперь, когда читатель хорошо осведомлен относительно нюансов расширенных точек прерывания, обратимся к одной из скрытых возможностей отладчика Visual C++ — удаленной отладке. Удаленная отладка означает, что ваша программа и крошечная отладочная заглушка выполняются на одной (удаленной) машине, а отладчик — на другой (локальной) машине, причем связь поддерживается через протоколы TCP/IP1. Хотя с помощью отладчика Visual C++ можно многое сделать и на одиночной машине, иногда разумнее выбрать двухмашинный (удаленный) вариант отладки. Удаленную отладку полезно применять, столкнувшись с любой из следующих ситуаций (которые могут сложиться под влиянием отладчика с полным графическим интерфейсом пользователя — GUI-отладчика):

  • при отладке критического кода активизации окна;
  •  при отладке графических программ;
  •  если нужно освободить как можно больше памяти для приложения;
  •  при выполнении отладки в Windows 98;
  •  если программист не хочет радикально изменять конфигурацию машины, устанавливая полную интегрированную среду разработки Visual C++.

 Самая плохая ситуация — первая (отладка критического кода активизации окна). На отдельной машине пошаговая отладка через Windows-сообщение WM_SETFOCUS и аналогичные процессы невозможна, потому что в пошаговом режиме программа теряет фокус отладчика. GUI-отладчики это, конечно, великолепно, но принцип неопределенности Гейзенберга справедлив и применительно к отладчикам! Перемещение отладчика на отдельную машину позволяет как отладчику, так и вашей программе иметь свой собственный фокус, аккуратно обходя эту проблему.

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


 TCP/IP — Transmission Control Protocol/Internet Protocol (Протокол Управления Передачей/Протокол Интернета). — Пер.

  Технология DirectX предоставляет разработчикам программного обеспечения специальные средства для доступа к устройствам. Это нечто среднее между стандартными средствами Windows и прямым доступом к устройствам. — Пер.

Третья ситуация — более тонкая и заслуживает отдельного внимания. Полный GUI-отладчик занимает значительное количество ресурсов. Если вам нужны вся мощь и комфорт отладчика Visual C++, значит приложение должно отказаться от некоторой части памяти, чтобы отладчик мог выполняться. В разработках реальных приложений отладочные построения могут достигать огромных размеров. Удаленная отладка позволит освободить часть памяти для выполнения приложения. Удаленная отладка особенно полезна, когда речь идет о тестировании на машинах с минимальными ресурсами.

Четвертая ситуация, в которой уместна удаленная отладка: при отладке программ, выполняющихся под управлением операционной системы Windows 98. Удаленная отладка позволяет отлаживать программы одной операционной системы, находясь в другой операционной системе. Кроме того, оказалось что отладчик Visual C++ лучше работает в Windows 2000, поэтому следует предпочесть Windows 2000 на локальной машине, где работает отладчик, a Windows 98 — на удаленной, где находится отлаживаемое приложение.

Наконец, заключительная ситуация: отладка выполняется на машине, на которой у приложения, по вашему мнению, могут возникнуть проблемы, связанные с версией системных DLL. Установка полной IDE для Visual C++ на рассматриваемой системе может привести к обновлению различных системных DLL, таким образом уничтожая шанс дублирования и исправления ошибки. Решить проблему можно копированием всего нескольких файлов, необходимых для работы удаленной части отладчика, на удаленную машину.

Подробное объяснение методики удаленной отладки приводится в документации Visual Studio. Желающие могут обратиться к теме библиотеки MSDN "Debugging Remote Applications" (Отладка удаленных приложений).



Остальная часть данного раздела посвящена специальным приемам и методикам, которые сделают удаленную отладку приятным и полезным экспериментом. Документация сообщает, какие файлы необходимо скопировать на удаленную машину, но она не сообщает, где их следует разместить. Эти каталоги перечислены в табл. 5.2.

Таблица 5.2. Файлы, необходимые для удаленной отладки, и их размещение в Visual C++

Файлы

Размещение в установленном Visual C++

MSVCMON.EXE, TLNOT.DLL, DM.DLL, MSDIS110.DLL

<VS Common>\MSDEV98\BIN

MSVCRT.DLL, MSVCP60.DLL

%SYSTEMROOT%\System32

PSAPI.DLL (только Windows 2000)

%SYSTEMROOT%\System32

Для успешной удаленной отладки нужно, во-первых, установить две системы так, чтобы локальная машина, на которой работает отладчик, могла отыскивать те же двоичные файлы, которые выполняет удаленная машина. Как минимум, нужно иметь общий (shared) доступ ко всем дисководам удаленной машины, потому что локальная машина будет нуждаться в доступе к согласованным двоичным файлам. Размещение отлаживаемой программы зависит от ее сложности: она может размещаться на локальной машине, а выполняться на удаленной; она может находиться на обеих машинах или только на удаленной машине. Если это стандартная ЕХЕ-программа, то удаленная машина может, вероятно, выполнять ее вне локальной машины. Однако в современном мире новейших СОМ-технологий иногда непросто принять решение о том, где следует выполнять программу. Лично я размещал программу на идентичных дисках и каталогах на обеих машинах. Во-вторых, прежде чем начать удаленную отладку, следует гарантировать, что имеется полностью и правильно установленная программа, готовая к выполнению на удаленной машине (куда бы вы ни решили поместить ее).

MSVCMON.EXE — это отладочная заглушка, которая выполняется на удаленной машине. Она имеет кнопку Settings, которая должна обеспечивать возможность задания сетевого имени локальной машины, но эта функция не действует, т. к. MSVCMON.EXE почему-то игнорирует установки.


Запустив MSVCMON.EXE, убедитесь, что ваш отладочный проект установлен правильно на локальной машине. Введите полный путь и имя двоичного (исполняемого) файла удаленной машины в редактируемое поле Remote Executable Path and File Name на вкладке Debug диалогового окна Project Settings. Когда вы заставляете локальный отладчик выполнять отладку удаленно, он фактически не стартует процесс отладки. Его стартует MSVCMON.EXE, поэтому необходимо сообщить этой программе, где следует искать двоичный файл.

После того как проект установлен и нажата кнопка Go, отладка, в значительной степени, выполняется так же, как обычно. Единственное отличие состоит в том, что локальный отладчик будет иногда подсказывать расположение согласованных DLL (вот почему необходимо разделение всех дисков удаленного компьютера — всегда должна быть возможность найти согласованные двоичные файлы, чтобы при встрече с какой-либо проблемой можно было взглянуть на ее источник). Хотя специальный флажок позволяет отключить согласование DLL, делать это не следует. Проблема состоит в том, что раз вы выключили согласование DLL, не существует никакого способа включить его обратно иначе, как удалив ОРТ-файл проекта. Кроме того, в ОРТ-файле проекта сохраняются пути к удаленно согласованным двоичным файлам, так что если позже вы захотите присоединиться к другой машине для удаленной отладки того же проекта, то единственным способом переустановки положения двоичного файла будет удаление и ОРТ-файла проекта. Имейте в виду, что удаление этого файла приведет к потере всех точек прерывания и компоновок экрана.

Можно комбинировать приложение дистанционного управления, например, pcAnywhere фирмы Symantec, с удаленной отладкой, получая возможность отлаживать свое приложение на машине пользователя. Мне приходилось делать это в корпоративных сетях интранет, но не в Интернете. Конечно, это может привести к некоторым проблемам безопасности, но все же неплохо иметь такое средство в своем арсенале. Вполне возможна ситуация, при которой машины пользователя и разработчика находятся на разных континентах, а проблему надо устранить в один день!

И, наконец, два последних не очень существенных замечания относительно удаленной отладки. Во-первых, закончив удаленную отладку, не забудьте установить в IDE Visual C++ режим локальной отладки. Установка удаленной отладки глобальна для всех проектов, хотя, по моему мнению, это должна быть раздельная установка по проектам. Во-вторых, если речь идет о сетевом приложении или о системе, которая чувствительна к сетевому трафику, то удаленная отладка использует TCP/IP, поэтому отладчик может помешать вам. В любой из этих ситуаций следует предпочесть отладчик WinDBG, который поддерживает удаленную отладку, используя последовательные порты и нуль-модемный кабель.



Содержание раздела