GDB调试 QNX程序 总结(适用于window 或ubuntu下)

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的堆栈信息

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ppipp1109

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值