添加ssh远程设备
在通用 Linux 设备和Qt Creator 之间建立连接,以便在这些设备上运行、调试和分析应用程序。
配置Qt Creator 与远程 Linux 设备之间的连接:
- 确保可以通过 IP 地址连接到您的设备。
- 配置Kits
- 转到首选项>Kits >Qt Versions 。
- 选择Add 添加嵌入式 Linux 的 Qt XML 版本。
- 转到Preferences >Kits >Compilers 。
- 选择Add ,添加用于构建应用程序的编译器。
- 转到Preferences >Devices >Devices 。
- 选择Add 添加远程 Linux 设备。
- 转到Preferences >Kits 。
- 选择Add ,添加用于为设备构建的工具包。
- 选择上面添加的 Qt 版本、编译器和设备。
- 在Run device 中选择Remote Linux Device ,在Type 中选择 ,然后在Device 中选择要运行的实际设备。
- 指定构建设置: 1. 为要在设备上开发的应用程序打开一个项目。 1. 选择Projects >Build & Run ,启用上文指定的工具包。
- 选择Run 以指定运行设置。通常可以使用默认设置。 运行项目时,Qt Creator 会按照部署步骤的指定部署应用程序。
使用 GDB 进行远程调试
在 GDB 服务器支持的目标机上调试时,本地 GDB 进程会与远程机器上运行的 GDB 服务器进行对话,后者控制着要调试的进程。
远程运行GDBServer
GDB 服务器进程通过传递端口号和可执行文件在远程机器上启动,(已运行的进程和未运行的都可以调试):
gdbserver :1234 <executable>
例子:
#!/bin/sh
#export #MALLOC_CONF=prof_leak:true,lg_prof_sample:19,prof:true,prof_prefix:/mnt/nfs/profile/jeprof.out,prof_final:true,lg_prof_interval:30
#export LD_PRELOAD=/mnt/nfs/libjemalloc.so.2
export QTDIR=/mnt/mtd/qte
export ASAN_OPTIONS=detect_odr_violation=0:symbolize=1:abort_on_error=1:disable_coredump=0:unmap_shadow_on_exit=1:detect_container_overflow=0:log_path=/mnt/nfs/asan.log
#export DIR_QT_LIBRARY_DATA=/mnt/nfs/
#export PKG_CONFIG_LIBDIR="/mnt/nfs/fontconfig/lib/pkgconfig"
#export LANG="en_US.UTF-8"
#export LANGUAGE="en_US:en"
#export MKISOFS="/mnt/mtd/mkisofs"
#设置线程栈大小为2MB,默认为8MB时会出现虚拟内存超过2.5G导致宕机
ulimit -s 2048
#DRM库打开很多句柄,将句柄数限制放大防止宕机
ulimit -n 65536
export rt_log_level=1
export QT_DEBUG_PLUGINS=1
export QT_QPA_EGLFS_DEBUG=1
export QT_LOGGING_RULES=qt.qpa.*=true
#linuxfb ---begin
export LD_LIBRARY_PATH=/mnt/nfs:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/mnt/nfs/plugins
export QT_QPA_FONTDIR=/mnt/nfs/fonts
#export FONTCONFIG_FILE=$QTDIR/fonts
export QT_QPA_PLATFORM=linuxfb
export QT_QPA_FB_VO=1
export QT_INIT_RKVO=0
export rt_log_level=1
export QT_QPA_EGLFS_KMS_CONFIG=/mnt/nfs/config.json
##############################################export QT_QPA_EVDEV_KEYBOARD_PARAMETERS=/dev/input/event0:ymap=/usr/mbin/azerty.qmap
export QT_QPA_FB_FORCE_FULLSCREEN=1
#export QT_QPA_FB_HIDECURSOR=1
#QT_QPA_GENERIC_PLUGINS=tslib,evdevkeyboard:/dev/input/event0,evdevmouse:/dev/input/event0
#export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb:tty=/dev/tty1:size=480x272:mmSize=480x272:offset=0x0
#linuxfb ---end
#eglfs ---begin
#export LD_LIBRARY_PATH=/mnt/nfs:$LD_LIBRARY_PATH
#export LD_LIBRARY_PATH=$QTDIR/drm-lib:$LD_LIBRARY_PATH
#字体库 插件
#export QT_PLUGIN_PATH=/mnt/nfs/plugins
#export QT_QPA_FONTDIR=//mnt/nfs/fonts
#export FONTCONFIG_PATH=/mnt/nfs/fonts
#export FONTCONFIG_FILE=/mnt/nfs/etc/
#export QT_QPA_PLATFORM_PLUGIN_PATH=/mnt/nfs/plugins
#export QTWEBENGINEPROCESS_PATH=/mnt/nfs/libexec
#export QT_QPA_DEFAULT_PLATFORM=eglfs
#export QT_INIT_RKVO=0
#export QT_USE_RK=0
#export QT_USE_RK_CURSOR=0
#export QT_QPA_PLATFORM=eglfs
#export rt_log_level=1
#export QT_LOGGING_RULES=qt.qpa.*=true
#export QT_QPA_EGLFS_KMS_CONFIG=/mnt/nfs/config.json
#export QT_QPA_EGLFS_KMS_ATOMIC=1
#export QT_QPA_EGLFS_INTEGRATION="eglfs_kms"
#export QT_QPA_EGLFS_INTEGRATION="eglfs_mali"
#export QT_QPA_EGLFS_DEBUG=1
#export QT_QPA_EGLFS_ALWAYS_SET_MODE=preferred
#export QT_QPA_EGLFS_ALWAYS_SET_MODE=1
###export QT_QPA_EGLFS_FORCE888=1
###export QT_QPA_EGLFS_KMS_CONNECTOR_INDEX=1
#export QT_QPA_EGLFS_KMS_PLANE_INDEX=1
#export QT_QPA_EGLFS_LAYER_INDEX=1
#eglfs ---end
# 启动程序并设置调试环境
export DEBUG_IPC=1
# 远程调试未运行的程序
#./gdbserver 0.0.0.0:7819 /mnt/nfs/xxx
# 远程调试正在运行的程序
./gdbserver 0.0.0.0:7819 --attach $(pgrep AlarmServer)
远程机如何运行在开发机上的gdbserver
方法:远程机器通过nfs挂载到开发机路径上
mount -t nfs -o nolock 开发机IP:路径 /mnt/nfs
安装nfs
a) 开发机安装执行如下命令:
sudo apt-get install nfs-kernel-server
b) 在文件/etc/exports最后一行添加如下内容:(/code/表示nfs访问的路径,192.168.*.*表示指定IP段)
vim /etc/exports
/code/ 192.168.*.*(rw,sync,no_root_squash) 限定IP
/code/ *.*.*.*(rw,sync,no_root_squash)
c) 重新启动rpcbind服务
/etc/init.d/rpcbind restart
d) 启动nfs服务
/etc/init.d/nfs-kernel-server restart
本地连接gdbserver
在运行Qt Creator 的本地机器上:
配置Kits
- 转到首选项>Kits >Qt Versions 。
- 转到Preferences >Kits >Compilers 。
- 选择Add ,添加用于构建应用程序的编译器。
- 转到Preferences >Kits 。
- 选择Add ,添加用于为构建的工具包。
- 选择上面添加的 Qt 版本、编译器和调试器,(匹配远程环境)。
连接远程
- 转到Debug >Start Debugging >Attach to Running Debug Server 。
- 在Kit 中,选择用于构建项目的构建和运行工具包。
- 在Server port 中,输入远程机器的名称和要使用的端口号。
- 在Local executable 中,指定本地计算机上应用程序可执行文件的路径。
- 在Command line arguments 中,指定要传递给可执行文件的命令行参数。
- 在Working directory 中,指定工作目录。默认为构建结果的目录。
- 为控制台应用程序选择Run in terminal 。
- 选择Break at "main" 可在主函数处停止调试器。
- 选择Use target extended-remote to connect 可在
target extended-remote mode中创建连接。在此模式下,当调试程序退出或您从程序中脱离时,调试器仍与目标相连。您可以重新运行应用程序,附加到正在运行的应用程序,或使用目标机专用的监控命令。例如,除非使用--once选项调用,否则 GDB 不会退出,但可以使用monitor exit命令使其退出。 - 在Override SysRoot 中,指定要使用的
sysroot的路径,而不是默认的sysroot。 - 在Init commands 中,输入与目标建立连接后立即执行的命令。
# 比如:过滤掉一些信号
handle SIGALARM nostop noprint
handle SIG32 pass noprint nostop
handle SIG33 pass noprint nostop
handle SIG34 nostop pass noprint
handle SIGPIPE nostop pass noprint
handle SIGCHLD nostop noprint pass
调试子进程
#fork 后跟踪子进程
set follow-fork-mode child
#父子进程都不释放,同时调试
set detach-on-fork off
#允许多进程同时运行
set schedule-multiple on
#断点时其他进程不冻结,仍然运行
set scheduler-locking off
#打开进程事件打印
set print inferior-events on
5. 在Reset commands 中,输入重置与目标的连接时要执行的命令。 6. 在Debug information 中,指定存储调试信息的位置。不能使用空路径。
- 在Override server channel 中,指定要使用的通信通道,如串行线路或自定义端口。
- 在Recent 中,选择要使用的最新配置。
- 选择OK 开始调试。
默认情况下,无响应的 GDB 进程会在 40 秒后终止。要增加GDB timeout 中的超时时间,请访问首选项>Debugger >GDB 。
有关在 GDB 中以target extended-remote 模式连接的更多信息,请参阅《使用 GDB 调试:连接到远程目标》。