标签: gdbserver

如何使用 gdb 和 gdbserver 加载共享库符号以进行远程源代码级调试?

我已经在 angstrom linux ARM 板(具有外部访问权限)上安装了 gdb 和 gdbserver,并且正在尝试从我的本地机器上获得共享库的源代码级调试。目前,如果我通过 ssh 进入设备,我可以运行 gdb 并且我能够让一切正常工作,包括设置断点、点击它并进行回溯。

当我尝试使用 gdbserver 执行相同操作并在我的主机上运行 gdb 以完成相同的事情时,我的问题就出现了(最终我希望在 eclipse 中使用它,但在 gdb 中目前已经足够了)。

我注意到,当我只在服务器上使用 gdb 并运行“信息共享”时,它会正确加载符号文件(syms read : yes for all),然后我就可以调试了。我没有这样的运气远程这样做,使用“符号文件”或“目录”或“共享”。它显然看到了文件,但即使我直接指定远程文件,我也无法加载任何符号。关于我接下来可以尝试的任何建议?

c linux debugging gdb gdbserver

5
推荐指数
1
解决办法
2970
查看次数

在 Eclipse CDT 中为远程调试启动部署文件的正确方法是什么?

我的情况:我目前正在尝试使用 Eclipse CDT 作为专有 IDE 的替代品。我有一个企业应用程序,它由一个可执行文件和许多(30 多个)共享库模块组成。该应用程序针对嵌入式非 x86 平台,具有兼容 POSIX 的操作系统(QNX 或 GNU/Linux,取决于所选的工具链)。因此,无法在开发人员的机器上进行调试。它必须远程完成。

我正在使用 Eclipse Luna/CDT 8.5 和远程系统资源管理器插件,并安装了 GDB/DSF 创建进程启动器。通过这些插件,Eclipse 可以远程启动程序并使用 gdbserver 对其进行调试。但只有主要的可执行文件可以配置为上传。

我想知道通过 Eclipse 为远程调试启动部署文件的合适方法是什么?

我目前的选择是:

  1. 使用远程系统资源管理器透视图,“导入”一些远程文件夹作为工作区中的“远程项目”。设置 Makefile 以在构建后将 .so 文件复制到映射文件夹。构建完成后,手动刷新“远程项目”。然后,文件将上传到远程系统。
  2. 使用远程系统资源管理器透视图,将工作区中的二进制文件“导出”到远程文件系统,以便在远程启动时上传文件。这种方法还要求我在开始调试会话之前“刷新”所有项目,否则不会注意到更改。
  3. 完全不要使用 Eclipse 进行文件上传,而是手动或通过构建脚本部署它们。
  4. 采取艰难的方式向 Eclipse ?DT 贡献一些代码。

有更好的解决方案吗?

linux remote-debugging eclipse-cdt shared-libraries gdbserver

5
推荐指数
1
解决办法
1246
查看次数

用GDB远程调试纯C程序

我正在尝试远程调试CAndroid设备上的纯程序.Android设备(目标)通过USB连接到主机.

我所做的是:从复制的目标以下文件: /system/lib,/vendor/lib,/system/bin/app_process,和/system/bin/linker.

目标:

  • 复制gdbserverNDK所述目标设备
  • 发送exe我要调试的内容
  • 在目标上使用运行的gdb服务器 ./gdbserver :5039 exec
    • 这基本上执行过程,得到一个 pid

主办:

  • 启用了端口 adb forward tcp:5039 tcp:5039
  • 跑了:arm-eabi-gcc exec.
  • 然后在gdb中:
    • set solib-search-path ...,我早先从目标中提取的库
    • target remote :5039

arm-eabi-gcc可以连接到远程进程,甚至继续(c)的执行.但是,我无法设置断点.如果我这样做,我会收到以下错误: Cannot access memory at address xxx.

我在这里错过了什么吗?

谢谢.

c android gdb android-ndk gdbserver

5
推荐指数
1
解决办法
1680
查看次数

Android远程gdb输出非常缓慢

我正在使用GDB(主机上的gdbserver + gdb)调试Android的C ++库,并且我注意到gdb输出非常慢。

例如,应用程序大约有15个线程,当我键入内容时thread apply all bt,将所有堆栈跟踪输出到终端/文件需要15-20秒。所有输出约为200行文本,应该不会那么慢!

而且,在我的主机(64位Ubuntu)上,相同的操作所花费的时间不超过0.1-0.2秒!

我怀疑主机上的终端输出可能是速度下降的原因,但事实并非如此。即使使用以下设置,也需要花费相同的时间:

set width 0
set height 0
set pagination 0
set logging redirect on
set logging overwrite on
set logging file prof.txt
set logging on
Run Code Online (Sandbox Code Playgroud)

我不能完全确定导致减速的主要原因是什么,要么是Android上的堆栈缓慢展开,要么是通过gdb <-> gdbserver连接的数据传输缓慢。但是我怀疑是后者,因为当gdb输出数据时,该adb进程会占用大量CPU时间。

我的问题是:如何使gdb输出到文件的速度更快?

如果有人知道如何实现以下目的之一,请提供帮助:

  • 设置一些gdb / adb选项以使数据传输更快
  • 使gdbserver将数据保存到本地文件(在Android设备上),而不是将其发送到远程gdb客户端
  • 为目标设备构建gdb客户端并在设备上调试

编辑:

值得一提的是,我正在使用adb forwardgdb和gdbserver之间建立tcp连接:

adb push $NDK_ROOT/prebuilt/android-arm/gdbserver/gdbserver /data/local/tmp
adb shell chmod 777 /data/local/tmp/gdbserver
adb shell /data/local/tmp/gdbserver :5039 --attach $1 &
adb forward tcp:5039 tcp:5039
Run Code Online (Sandbox Code Playgroud)

c++ debugging android gdb gdbserver

5
推荐指数
0
解决办法
418
查看次数

gdb 远程调试缓存远程目标

我正在使用 CLion 来连接到gdbserver远程机器上运行的远程(通过 ssh 端口转发)。

除了一件事,我工作得不太好,每次我连接到它都会下载所有链接的依赖项gdbserver

在此处输入图片说明

所以,我不知道是否有任何标志可以传入gdb remote以缓存此类文件。

c c++ gdb gdbserver clion

5
推荐指数
1
解决办法
1159
查看次数

gdbserver - glob 无法处理模式“(null)”

gdbserver localhost:2159 test_app.exe
Run Code Online (Sandbox Code Playgroud)

每当我输入此类命令时,
我都会收到此类消息:

glob 无法处理模式“(null)”。

另外,我在 Windows 机器上使用哪种终端/ CLI
并不重要 - 结果总是相同的。


我想通过 CLion 调试我的 PDCurses/NCurses 应用程序。
每次遇到initscr()CLion 函数时,它都会对我说:

不支持重定向。

所以唯一的解决方法似乎是使用 GDB 远程调试。但由于上述问题,我不确定我的设置是否正确


$ gdbserver --version
GNU gdbserver (GDB) 8.1
Copyright (C) 2018 Free Software Foundation, Inc.
gdbserver is free software, covered by the GNU General Public License.
This gdbserver was configured as "x86_64-w64-mingw32"
Run Code Online (Sandbox Code Playgroud)

windows ncurses gdbserver mingw-w64 clion

5
推荐指数
0
解决办法
702
查看次数

Visual Studio 2017 Linux远程调试(gdbserver)

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

#include <cstdio>

int main()
{
    printf("hello from testLinuxDebug!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

无法开始调试。命令“-interpreter-exec console“target remote localhost63361””出现意外的 GDB 输出。远程连接已关闭。

开始调试后的消息(从 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

来自 Linux 控制台窗口的消息(从 VS2017 捕获的图像)

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

c++ linux gdb gdbserver visual-studio-2017

5
推荐指数
1
解决办法
2774
查看次数

一种从本地 sysroot 和远程 gdbserver 加载 GDB 库的方法

在使用 gdbserver 进行远程调试时,我想让 gdb 从本地 sysroot 加载正在调试的程序的一些共享库,但也允许从 gdbserver 下载功能加载其他不在 sysroot 中的功能。

gdb 似乎只能使用一种方法来查找库、本地文件或远程下载,而不能同时使用这两种方法。

例如,如果我将 sysroot 设置target:/为使用远程文件,则所有内容都将被下载:

(gdb) set sysroot target:/
(gdb) run
Starting program:  
Reading /root/a.out from remote target...
warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.
Reading /root/a.out from remote target...
Reading symbols from target:/root/a.out...
Reading /lib/ld-linux-armhf.so.3 from remote target...
Run Code Online (Sandbox Code Playgroud)

不幸的是,远程系统上的系统库没有调试符号。它是一个闪存空间有限的嵌入式系统。调试符号会大大增加文件系统的总大小,而且根本不适合。

但是,我有一个所有系统库的本地 sysroot 树,这确实包括调试符号。但是如果我将 sysroot 设置为这棵树,gdb 将不再考虑远程下载。

(gdb) set sysroot /bsp/sysroot
(gdb) run
Starting program:  
Reading symbols from …
Run Code Online (Sandbox Code Playgroud)

debugging gdb gdbserver

5
推荐指数
1
解决办法
2040
查看次数

如何在 gdb/gdbserver 设置中重定向 tty

我有一个使用 gdb(在一host台机器上)和一个 gdbserver(在一target台机器上)的远程调试设置。

我正在使用的 gdb 命令类似于

target remote | ssh -T user@192.168.222.111 gdbserver - app_to_debug arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)

这工作正常,stdio 通过 ssh 从 gdbserver 重定向到 gdb。

是否可以将此 stdio 重定向到我的主机上的另一个终端?

我尝试在 gdb 中做类似的事情:

tty /dev/pts/10

Run Code Online (Sandbox Code Playgroud)

但这仅适用于没有 ssh/gdbserver 设置的情况。

debugging ssh redirect gdb gdbserver

5
推荐指数
0
解决办法
337
查看次数

尝试连接到目标进行远程 GDB 调试时出现连接超时错误

当尝试使用 GDB 进行远程目标调试时,出现以下错误:

连接超时

远程目标是基于ARM的,主机是X86。我遵循的步骤如下:

  1. 通过发出以下命令在目标上运行 gdbserver:

    gdbserver --attach :1000 937

    其中 937 是我要调试的应用程序的 PID。

  2. 从主机端调用GDB。

    gdb-multiarch applicationName

    (gdb) target remote xx.xxx.xxx.xx:1000

    其中xx.xxx.xxx.xx是远程计算机的 IP 地址。

谁能建议我在这里缺少什么?

gdbserver

5
推荐指数
1
解决办法
1872
查看次数