Удаленная отладка с помощью Eclipse CDT - отладка приложения, которое загружается динамически

Я пытаюсь сделать удаленную отладку в среде CDT Eclipse Juno на Windows 7, в то время как удаленная машина работает под Linux. Так что для общей цели, к сожалению, точная настройка намного сложнее, так что я боролся с этой проблемой уже больше недели, и ни одно из решений, представленных в результатах поиска, не является достаточным.

Итак, вот моя точная настройка (очень жаль за этот длинный текст!):

  • У меня есть приложение C++ Y, которое я разрабатываю и собираю на компьютере A.
  • Я перемещаю файл.so (отладочная сборка) на компьютер B, который работает под Linux. У меня нет исходного кода, доступного там.
  • Я не запускаю свое приложение Y явно на компьютере B. Существует другое приложение Z, которое сначала запускается, затем я запускаю определенную функцию, чтобы мое приложение Y загружалось динамически. На самом деле это делается из хранимой процедуры базы данных, но я опущу эти детали, чтобы не озадачивать вас полностью...
  • У меня локальная машина C работает под Windows, с которой я хочу отлаживать. У меня есть копия исходного кода Y и исполняемого файла там, но не из приложения Z.
  • Я не могу изменить эти настройки.

Теперь я установил gdbserver (GNU gdbserver (GDB) SUSE (7.2-3.3)) на машине B, gdb на машине C - скомпилировал его с совпадающими адресатом и хостом, как это найдено в общих руководствах, вывод версии говорит следующее:

    GNU gdb (GDB) 7.6.50.20130508-cvs (cygwin-special)
    Copyright (C) 2013 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "i686-cygwin".

Я установил плагин Eclipse для запуска и отладки удаленных приложений. Я настроил все как предложено в http://wiki.eclipse.org/CDT/User/FAQ Когда я сейчас запускаю сеанс отладки, gdbserver и приложение Z успешно запускаются на компьютере B из Eclipse. Я также могу запустить свое приложение Y, вызвав хранимую процедуру. Но здесь возникают следующие проблемы и вопросы:

  • При запуске отладчика он говорит:

    warning: Unable to find dynamic linker breakpoint function.
    GDB will be unable to debug shared library initializers
    and track explicitly loaded dynamic code.
    Created trace state variable $trace_timestamp for target's variable 1.
    

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

  • Я не знаю, где включить мой исходный код, чтобы он был доступен для установки точек останова и т. Д. Во время сеанса отладки. Поскольку у меня нет проекта Eclipse, я знаю, что мне просто нужно указать путь к нему где-нибудь. Я добавил корневую папку кода в исходный путь поиска конфигурации отладки, но это, похоже, не работает.
  • В конфигурации отладки Eclipse я ввожу путь к приложению C++, которое я хочу запустить. Для команды на удаленной машине мне нужно ввести приложение Z, так как я не могу явно запустить свое приложение Y. Таким образом, я ввел путь моего приложения Y в поле для моего локального приложения C++. Это верно?
  • При запуске сеанса отладки и запуске моего приложения Y извне в отладчике ничего не происходит. Мое приложение Y работает и выдает результаты, но я ничего не получаю в консоли отладчика. Я хотел бы установить точки останова, но так как мой исходный код не найден, я не знаю, как...

Я попытался выполнить отладку gdb непосредственно на удаленной машине (запуск приложения Z, запуск приложения Y извне) и попытался установить точки останова для определенных функций из моего приложения Y. Но это тоже не сработало. Тем не менее, я не получил предупреждение, упомянутое выше.

Так что теперь я застрял здесь и не знаю, что делать. Я прочитал много тем и блогов, но ни один из них не имеет такой специфической настройки, как у меня, поэтому всегда не хватает некоторых деталей.

Я действительно очень ценю вашу помощь.

1 ответ

Вместо точки останова, поместите sleep() где-нибудь в вашем коде, затем присоедините его к GDB, пока он спит.

Другие вопросы по тегам