Вячеслав Печенин
slava@baltica.ru
Borland Turbo Debugger (далее TD) - бесплатная альтернатива встроенным отладчикам из коммерческих сред разработки (e.g., MSVC или BCB). Скачать можно здесь.
1. TD поможет отладить только то, что получено компилятором BCC 5.5 (взять можно здесь, патчи здесь).
2. TD - консольное приложение (удивляться этому особенно не нужно; Far, если вы заметили, тоже не особенно GUI) для отладки только Win32 приложений. И тем не менее совсем не дружит с кодовой страницей OEM (см.подробнее). По сему применять этот отладчик сложнее, чем интегрированные в IDE.
1) Сборка .DLL, включая отладочную информацию.
2) Открываете хост-приложение FAR.EXE
3) Обращаете внимание TD на вашу .DLL
5) На остановках делаете дело.
Компилятор. Нужно, чтобы BCC поместил в результат debug info и line info. Первое включено по умолчанию (или "-v" для параноиков), второе включается руками "-y".
Редактор связей. Он по умолчанию помещает в результат только самое нужное. Чтобы Debug info попало в эту категорию используйте ключик "-v".
Итого:
bcc32 -c -v -y Hello.cpp
ilink32 -Tpd -v c0d32.obj Hello.obj,Hello.dll,,cw32.lib import32.lib
Перед тем, как запускать TD, не забудьте, что FAR.EXE должен будет по ходу дела подгрузить вашу .DLL как плагин. Поместите вашу .DLL и .TDS файлик куда нужно. .TDS ссылается на ваши исходники, которые TD найдет там, куда укажет ключик "-sd".
Также неплохо, чтобы TD текущей директорией сделал ту, где лежит .DLL, которую подхватит FAR.EXE. Ключик "-t".
Итого:
td32 -sd"C:\Hello Plugin\Source" -t"C:\Program files\Plugins\Hello" "C:\Program files\Far\Far.exe"
TD остановится с сообщением, что FAR.EXE не содержит debug info. Это - правда. Да и хорошо, что остановится: время предупредить TD, чтобы сделал позже еще одну остановку - тогда проставим breakpoints в HELLO.DLL.
Давим F3 (меню VIEW->MODULE...).
В поле "DLL name" можно ввести: "hello" или "hello.dll" или даже "c:\path\hello.dll" (если ключик "-t" вы не захотели TD указать).
Жмите "Add DLL", не стесняйтесь.
Больше этот диалог не нужен. ESC на него. И продолжим - F9 (Run->Run).
Вопрос: зачем же руками TD сообщать о DLL, которую чуть позже FAR.EXE загрузит?
Ответ: а за тем, что TD выставил флажок "debug startup" (посмотрите сами), и сделает нужную нам остановку, когда FAR.EXE действительно подгрузит HELLO.DLL
TD остановится на входе в HELLO.DLL
Ба-а-а, что же мы видим - дизассемблерованный код. Зачем он нам, какой от него толк? Не все сразу, потерпите.
Давим F3.
HELLO.DLL -> "Symbol load" (вот и пригодился .TDS файлик)
Oops, диалог пропал. А ничего не произошло.
Давим опять F3. И видим, что не зря только что диалог пропадал:
Список "Source modules" пополнился. Выбираешь модуль, давишь "Load" и попадаешь в его исходник, все логично. А попав в исходник, не теряйся, ставь breakpoint.
Замечания.
* Временами попав в исходник, TD не дает поставить breapoint. Тогда нужно сходить в меню VIEW->VARIABLES и найти нужную ф-цию там.
** Все расставленные остановки сохранятся в .TR2, который как-то связывается с .TDS. Так что пересобрав .DLL, а значит получив новый .TDS, или удалив .TR2 - вы потеряете всю информацию об остановках. И все с начала...
Здесь все делается, как обычно в инструментах от Borland. Единственно, что я для себя с удивлением открыл: неутомимый "Inspect" - можно встать курсором на символьном имени и правой кн. мыши проинспектировать, а там опять же можно проинспектировать и т.д.
Трассировать можно с легкостью по исходнику. Можно по дизассембл. коду. Однако, если вы хотите шагнуть F7 за пределы своей .DLL, то нужно переключиться в ассебл. вид.
Будучи консольным приложением TD показывает все строчки в ANSI. Это не значит для плагинописания ничего хорошего, ведь Far и плагины, следуя его правилам, все показывает в OEM. Как победить TD в этом вопросе - я не знаю. Небольшой совет: в диалоге Evaluate/Modify (@F4) введите "lpstr[0],c10" и увидите свою строчку в OEM. Этот же фокус поможет для Watch. А для Inspect не поможет.
Самое интересное, что несмотря на рутинную ботву в работе с TD, я им пользуюсь. Потому что:
Rev. 24.12.2000