Visual Studio 2017 Linux 远程调试(gdbserver)

Posted

技术标签:

【中文标题】Visual Studio 2017 Linux 远程调试(gdbserver)【英文标题】:Visual Studio 2017 Linux remote debugging (gdbserver) 【发布时间】:2018-06-29 11:29:35 【问题描述】:

在我的远程机器(Ubuntu 16.04.4 LTS)上安装 gdbserver 后,我通过在 Visual Studio 2017 中创建“跨平台控制台应用程序 (linux)”项目来测试以下 c++ 代码:

#include <cstdio>

int main()

    printf("hello from testLinuxDebug!\n");
    return 0;

我将我的 Ubuntu 机器的连接信息(IP 地址、ID、密码)添加到连接管理器并选择“gdbserver”作为调试模式。

然后我开始调试并收到以下消息:

无法开始调试。来自命令的意外 GDB 输出 “-interpreter-exec 控制台“目标远程 localhost63361””。偏僻的 连接已关闭。

Message after starting to debugging (Image captured from VS2017)

顺便说一句,我从 Visual Studio 2017 的调试菜单的 Linux 控制台窗口收到以下消息:

进程 /home/.../projects/testLinuxDebug/bin/x64/Debug/testLinuxDebug.out 创建; pid = 29277 监听端口 4444 从主机远程调试 127.0.0.1 /build/gdb-9un5Xp/gdb-7.11.1/gdb/gdbserver/regcache.c:264:检测到问题 > GDBserver 内部。请求未知寄存器 ymm0h

Message from Linux Console Window (Image captured from VS2017)

有人可以帮我解决这个问题吗?

【问题讨论】:

看起来客户端机器上的 gdb(不兼容)比远程 gdbserver 上的版本高 【参考方案1】:

我在 Ubuntu 16.04 机器上遇到了同样的问题。

我查看了gdbserver 上的源代码,它似乎是处理器寄存器 (ymm0h) 的问题,它仅适用于 i386 处理器。

问题是,我不知道如何修复 gdbserver 以特别不使用此寄存器,但您可以通过在 Ubuntu 上将 gdbgdbserver 升级到版本 8.3 来解决错误机器。如果我的猜测是正确的,8.1 版本是解决此问题的版本,但默认情况下,Ubuntu 16.04 的gdbgdbserver 都有7.11.1 版本。

您可以在 linux 机器上运行这些命令来做到这一点:

wget "http://ftp.gnu.org/gnu/gdb/gdb-8.3.tar.gz"
tar xzf gdb-8.3.tar.gz
cd gdb-8.3
./configure --prefix=/usr --with-system-readline
make
sudo make install

你可能需要安装一些额外的包来编译gdb:

sudo apt-get install libreadline6-dev texinfo

如果您在尝试安装 gdb 时仍然遇到问题,请尝试来自 Linux from Scratch 的示例。

祝你好运!

【讨论】:

【参考方案2】:

我遇到了和你一样的问题,虽然对我来说问题出在 Microsoft's Visual Studio Online 平台上 - 由于同样的错误,我无法使用 pwntools 的 gdb.debug/gdb.attach 功能(依赖于 gdbserver)在VSOnline的docker环境中。

为可能遇到与我相同问题的人留下这个答案。

问题和步骤与Canella described 非常相似 - 问题的根源确实是环境中的旧 GDB 版本(撰写本文时为 7.12)。

我已经使用 python3 绑定编译了我的 GDB,如果您打算使用 GEF 或类似的 GDB 扩展,您可能也想这样做。

以下是在 VSOnline 环境的终端中执行此操作的方法:

# I needed to get rid of the apt-provided gdb for it to work properly
sudo apt remove gdb
# VSOnline has a weird way of handling python versions
# you're better off installing python3 from apt, if it's not installed yet
sudo apt update
sudo apt install libreadline6-dev texinfo python3 python3-dev
wget "http://ftp.gnu.org/gnu/gdb/gdb-8.3.tar.gz"
tar xzf gdb-8.3.tar.gz
cd gdb-8.3
mkdir build && cd build
../configure --prefix=/usr --with-system-readline --with-python=/usr/bin/python3
make
sudo make install

【讨论】:

以上是关于Visual Studio 2017 Linux 远程调试(gdbserver)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2017 中为 Linux 应用启用多线程

使用 Visual Studio 2017 进行远程调试时,Linux 控制台输出在哪里?

Visual Studio 2017开发linux程序之libevent使用实例

如何使用 Visual Studio 2017 Linux 支持编译和构建 C++17 代码?

使用 Visual Studio 2017 在 Linux 上构建现有 C++ 解决方案

使用 Visual Studio 2017 调试已运行的 Docker Linux .NET Core 容器