我已经在 angstrom linux ARM 板(具有外部访问权限)上安装了 gdb 和 gdbserver,并且正在尝试从我的本地机器上获得共享库的源代码级调试。目前,如果我通过 ssh 进入设备,我可以运行 gdb 并且我能够让一切正常工作,包括设置断点、点击它并进行回溯。
当我尝试使用 gdbserver 执行相同操作并在我的主机上运行 gdb 以完成相同的事情时,我的问题就出现了(最终我希望在 eclipse 中使用它,但在 gdb 中目前已经足够了)。
我注意到,当我只在服务器上使用 gdb 并运行“信息共享”时,它会正确加载符号文件(syms read : yes for all),然后我就可以调试了。我没有这样的运气远程这样做,使用“符号文件”或“目录”或“共享”。它显然看到了文件,但即使我直接指定远程文件,我也无法加载任何符号。关于我接下来可以尝试的任何建议?
我的情况:我目前正在尝试使用 Eclipse CDT 作为专有 IDE 的替代品。我有一个企业应用程序,它由一个可执行文件和许多(30 多个)共享库模块组成。该应用程序针对嵌入式非 x86 平台,具有兼容 POSIX 的操作系统(QNX 或 GNU/Linux,取决于所选的工具链)。因此,无法在开发人员的机器上进行调试。它必须远程完成。
我正在使用 Eclipse Luna/CDT 8.5 和远程系统资源管理器插件,并安装了 GDB/DSF 创建进程启动器。通过这些插件,Eclipse 可以远程启动程序并使用 gdbserver 对其进行调试。但只有主要的可执行文件可以配置为上传。
我想知道通过 Eclipse 为远程调试启动部署文件的合适方法是什么?
我目前的选择是:
有更好的解决方案吗?
linux remote-debugging eclipse-cdt shared-libraries gdbserver
我正在尝试远程调试CAndroid设备上的纯程序.Android设备(目标)通过USB连接到主机.
我所做的是:从复制的目标以下文件:
/system/lib,/vendor/lib,/system/bin/app_process,和/system/bin/linker.
目标:
gdbserver从NDK所述目标设备exe我要调试的内容./gdbserver :5039 exec
pid主办:
adb forward tcp:5039 tcp:5039arm-eabi-gcc exec.set solib-search-path ...,我早先从目标中提取的库target remote :5039在arm-eabi-gcc可以连接到远程进程,甚至继续(c)的执行.但是,我无法设置断点.如果我这样做,我会收到以下错误:
Cannot access memory at address xxx.
我在这里错过了什么吗?
谢谢.
我正在使用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输出到文件的速度更快?
如果有人知道如何实现以下目的之一,请提供帮助:
编辑:
值得一提的是,我正在使用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) 我正在使用 CLion 来连接到gdbserver远程机器上运行的远程(通过 ssh 端口转发)。
除了一件事,我工作得不太好,每次我连接到时它都会下载所有链接的依赖项gdbserver:
所以,我不知道是否有任何标志可以传入gdb remote以缓存此类文件。
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) 在我的远程计算机(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 输出。远程连接已关闭。
顺便说一句,我从 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 捕获的图像)
有人可以帮我解决这个问题吗?
在使用 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) 我有一个使用 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 设置的情况。
当尝试使用 GDB 进行远程目标调试时,出现以下错误:
连接超时
远程目标是基于ARM的,主机是X86。我遵循的步骤如下:
通过发出以下命令在目标上运行 gdbserver:
gdbserver --attach :1000 937
其中 937 是我要调试的应用程序的 PID。
从主机端调用GDB。
gdb-multiarch applicationName
(gdb) target remote xx.xxx.xxx.xx:1000
其中xx.xxx.xxx.xx是远程计算机的 IP 地址。
谁能建议我在这里缺少什么?