1

我正在尝试在 Windows 7 上的 Eclipse Juno 的 CDT 环境中进行远程调试,而远程机器在 Linux 下运行。对于一般用途而言,不幸的是,确切的设置要复杂得多,因此我已经为这个问题苦苦挣扎了一个多星期,搜索结果中提供的解决方案都不够用。

所以,这是我的确切设置(很抱歉这么长的文字!):

  • 我有一个 C++ 应用程序 Y,我在机器 A 上开发和构建它。
  • 我将 .so 文件(调试版本)移动到在 Linux 下运行的机器 B。我那里没有可用的源代码。
  • 我没有在机器 B 上显式地启动我的应用程序 Y。首先启动了另一个应用程序 Z,然后我触发了一个特定的功能,以便动态加载我的应用程序 Y。实际上它是从数据库存储过程中完成的,但我会省略这些细节以避免让你完全困惑......
  • 我的本地机器 C 在我想从中调试的 Windows 下运行。我在那里有 Y 的源代码和可执行文件的副本,但不是来自应用程序 Z。
  • 我无法更改这些设置。

现在,我在机器 B 上安装了 gdbserver (GNU gdbserver (GDB) SUSE (7.2-3.3)),在机器 C 上安装了 gdb - 使用常见教程中的匹配目标和主机对其进行编译,版本输出如下:

    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#How_do_I_debug_a_remote_application.3F中的建议设置了所有内容。 当我现在开始调试会话时,gdbserver 和应用程序 Z 从 Eclipse 中的机器 B 上成功启动。我还可以通过调用存储过程来触发我的应用程序 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。因此,我在本地 C++ 应用程序的字段中输入了我的应用程序 Y 的路径。那是对的吗?
  • 当启动调试会话并从外部触发我的应用程序 Y 时,调试器中没有任何反应。我的应用程序 Y 正在运行并提供结果,但我在调试器的控制台中没有得到任何东西。我想设置断点,但是由于找不到我的源代码,我不知道如何...

我尝试直接在远程机器上进行 gdb 调试(启动应用程序 Z,从外部触发应用程序 Y)并尝试在我的应用程序 Y 的特定功能处设置断点。但这也不起作用。不过,我没有收到上面提到的警告。

所以现在我被困在这里,不知道该怎么办。我已经阅读了很多主题和博客,但没有一个像我这样有特定的设置,所以总是缺少一些细节。

我真的,真的,真的很感谢你的帮助。

4

1 回答 1

0

代替断点,将 sleep() 放在代码中的某个位置,然后在 GDB 睡眠时将其附加到 GDB。

于 2013-08-27T11:44:40.237 回答