gdb 调试程序 步骤:
gdb 的选择依赖于目标平台,qnx 提供了以下四种:
Target platform | gdb_variant |
ARMv7 | ntoarmv7-gdb |
ARMv8 | ntoaarch64-gdb |
x86 | ntox86-gdb |
x86 64-bit | ntox86_64-gdb |
注意:QNX的GDB使用的是Server+Client的架构:在板子上,有一个后台服务qconn,用于提供QNX对外的互联服务;在PC端(Ubuntu),使用的是ntoarmv7-gdb(QNX公司对GDB做了扩展)
debug a program in the IDE 比较简单,不再赘述,主要介绍GNU模式下 进行gdb调试。
1. 要用gdb 调试,首先编译的application qcc的时候,需要加参数 -g -O,有些程序 编译的时候 添加-g -O 无效,可以重新只用-g 编译。强烈建议在用gcc编译的时候,都添加-g,即使你认为自己的程序完全没有错误。
2. 接下来要注意你的host主机是 Ubuntu还是window :
如果是ubuntu,找到qnx的安装目录并进入。我这里是qnx700执行:
qnxsdp-env.sh
如果是 window 同样找到qnx700 安装目录,执行
qnxsdp-env.bat
注意:对于qnx6.6和 6.5 名字有所区别,只要找到对应的脚本文件,执行即可,上面命令的作用,就是将qnx的运行环境添加到系统环境变量中。类似于下图:
3. 然后在window的命令行就可以使用ntox86_64-gdb 指令了。
4. 在gdb之前,可以用qcc gcc,qt,ide等等各类工具生成你需要的debug版本的执行程序
可以随便新建一个hello world的例子
#include <iostream>
using namespace std;
int main() {
cout << "Hello World!!!" << endl; // prints Hello World!!!
return 0;
}
5. 用qcc 编译
qcc -V //可以查看当前系统可用的qcc版本
qcc -V gcc_ntox86_64 hello.cpp -g -O hello
6. 然后启动 gdb
ntox86_64-gdb
7. 进入gdb 模式,添加远程target:
(gdb)target qnx 192.168.1.120:8000 //这里的ip需要改成你工控机或者虚拟机或者arm板子的ip,如果没有设置提前设置 (gdb)file /你的目录/hello (gdb)upload /你的目录/hello /tmp/hello
注意:目标机首先需要设置ip 默认环境中,qconn已经启动,侦听的是8000端口号。可以根据需要重启qconn进程:如换个端口号,qconn port=8888,或者你的库不在现有的LD_LIBRARY_PATH中,重新设置了LD_LIBRARY_PATH后。
8. 之后设置断点等GDB的常规操作即可。注意。gdb退出以后,程序并未在工控机上结束运行的话,需要手动slay一下或者kill一下。
9. 手册中的步骤:
To debug an application, do the following:
1. Start GDB, but don't specify the application as an argument:
gdb
2. Load the symbol information for the application:
file my_application
3. Set the target:
target qnx com_port_specifier | host:port
4. Send the application to the target:
upload my_application /tmp/my_application
5. Set any breakpoints. For example, to set a breakpoint in main():
set break main
6. Start the application:
run
bt //查看堆栈信息
10. 手册中的例子:
(gdb) target qnx mytst:8000
Remote debugging using mytst:8000
Remote target is little-endian
(gdb) file /tmp/helloworld
Reading symbols from /tmp/helloworld...done.
(gdb) upload /tmp/helloworld /tmp/helloworld
(gdb) b main
Breakpoint 1 at 0x804860c: file ./main.c, line 5.
(gdb) r
Starting program:
Remote: /tmp/helloworld
Breakpoint 1, main () at ./main.c:5
5 {
(gdb)
11. 遇到的问题:
在远程gdb 在线调试 qt 程序的时候报错找不到库,是因为本地环境变量中没有加载qt的路径,在 window 上的环境变量中添加即可: 我这里则做法是修改 qnx的bat 文件,修改后的文件如下:
注意: 我的qt库放在了qnx700 根目录下;如果是调试arm的需要调用QT_BASE_ARMLE_V7,而不是QT_BASE_X86_64了;
@echo off
REM This script is sets environment variables requires to use this version of QNX Software Development Platform
REM from the command line.
set QNX_BASE=%~dp0
@echo on
set QNX_BASE=%QNX_BASE:\=/%
set QNX_TARGET=%QNX_BASE%/target/qnx7
set QNX_HOST=%QNX_BASE%/host/win64/x86_64
set QNX_CONFIGURATION=%USERPROFILE%/.qnx
set QT_BASE=%QNX_BASE%/qt/Qt5.6.2/win64/x86_64/target
set QT_BASE_X86_64=%QT_BASE%/x86_64
set QT_BASE_ARMLE_V7=%QT_BASE%/armle-v7
set LD_LIBRARY_PATH=%QT_BASE_X86_64%/lib
set QT_QPA_PLATFORM_PLUGIN_PATH=%QT_BASE_X86_64%/plugins
set QT_PLUGIN_PATH=%QT_BASE_X86_64%/plugins
set QML2_IMPORT_PATH=%QT_BASE_X86_64%/qml
set MAKEFLAGS=-I%QNX_TARGET%/usr/include
set PATH=%QNX_HOST%/usr/bin;%QNX_BASE%/jre/bin;%PATH%;%QT_BASE_X86_64%/bin;%QT_BASE_X86_64%
set TMPDIR=%TMP%
12. qnx 调试coredump
qnx 下程序或者进程一旦crash 产生了cordump 也是可以通过gdb进行调试的。关于coredump的设置和调试详细看 coredump 使用详细总结。
在qnx下调试coredump 步骤:
1. 如上设置了相应的gdb 例如 ntox86_64-gdb
2. 将产生core的 可执行程序放到某个目录下;
3. 将产生的core文件拷贝到同目录下;
4. 执行下面命令,查看coredump具体信息
(gdb) xtox86_64-gdb hello hello.core //这里hello换成你的程序 hello.core换成你的core文件
(gdb) r
(gdb) //something will show here
(gdb) bt //查看coredump的堆栈信息