使用Eclipse CDT进行远程调试 - 调试动态加载的应用程序

时间:2013-06-21 10:14:07

标签: gdb shared-libraries eclipse-cdt remote-debugging gdbserver

我正在尝试在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中设置特定函数的断点。但这也不起作用。不过,我没有得到上面提到的警告。

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

我真的非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

而不是断点,将sleep()放在代码中的某处,然后在它休眠时将它附加到GDB。

相关问题