据说有为嵌入式提供的 QT Debug 手段,但是目前还没发现,所以想到了这个笨办法。有更好思路的可以推荐。

该思路是基于 QDebug() 。因为 QT 提供了重写 QT msg 处理方法的接口 qInstallMsgHandler(),所以,我们可以利用该接口把 QtDebugMsg,QtWarningMsg,QtCriticalMsg,QtFatalMsg 等信息按照指定的方式进行输出,而不是输出到默认的“标准输出”。之前使用该方法将所有调试信息全部输出到“debug.log”文件,但是,存在有时候忘记删除该接口,导致设备 flash 被 log 文件塞满的隐患,所以,今天尝试了使用 UDP 来作为 msg 输出手段。

功能已初步完成,在 A 侧设备内部通过 UDP 输出调试信息,在 B 侧使用任意 UDP 客户端监听并显示。测试代码,以及接收用的 Python 代码见下面。

#include    <QtCore/QCoreApplication>
#include <QDebug>
#include <QtNetwork/QUdpSocket>
#include <QHostAddress>
#include <QDateTime>
#include <iostream> #define _TIME_ qPrintable(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")) static void networkLog(QtMsgType type, const char* msg)
{
QString qstrTest;
switch (type)
{
case QtDebugMsg:
qstrTest = QString("%1: %2").arg(_TIME_ , msg);
break;
case QtWarningMsg:
qstrTest = QString("%1: %2").arg(_TIME_ , msg);
break;
case QtCriticalMsg:
qstrTest = QString("%1: %2").arg(_TIME_ , msg);
break;
case QtFatalMsg:
qstrTest = QString("%1: %2").arg(_TIME_ , msg);
exit();
}
QUdpSocket *udpSocket = new QUdpSocket();
//udpSocket->bind( QHostAddress("192.168.100.14"), 11334 ); udpSocket->bind(QHostAddress(), , QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint); QHostAddress hostaddr;
hostaddr.setAddress( "255.255.255.255" );
udpSocket->writeDatagram( qstrTest.toAscii(), hostaddr, ); udpSocket->close();
} int
main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); qInstallMsgHandler(networkLog); qDebug()<<"qDebug(), hello QT!"; printf("printf, hello QT! \n"); while()
{
qDebug()<<"it's a test!"; std::cout<<"cout, hello QT!"<<std::endl; ::sleep();
} return a.exec();
}

这里因为是用了 UDP ,所以,还需要在 Project 文件中加入对 Socket 的支持,所以顺便贴出使用的 project 文件。

QT  += network

TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += . # Input
SOURCES += main.cpp

该 QT 工程编译之后,运行,其中的 qDebug() 信息即被使用 UDP 在局域网内进行广播,广播目的端口是 12345。所以,我们在局域网内某电脑打开 12345 端口监听即可(目前这样写,每次发送的端口号都在变,所以,当接收端指定发送端口时,客户端会“假死”;比如NetCat,它会和第一个发包给它的“地址-端口”绑定,那么他就没法收以后的包了)。使用下面的 Python 脚本可以正常接收。

#!/usr/bin/env python

import socket
from struct import * s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("0.0.0.0", 12345)) while True:
data, addr = s.recvfrom(1024) print addr,data

看到如下显示:

./swDebug.py
('192.168.100.16', 59998) 2015-11-24 17:17:24: qDebug(), hello QT!
('192.168.100.16', 48415) 2015-11-24 17:17:24: it's a test!
('192.168.100.16', 34366) 2015-11-24 17:17:25: it's a test!
('192.168.100.16', 55790) 2015-11-24 17:17:26: it's a test!
('192.168.100.16', 35438) 2015-11-24 17:17:27: it's a test!
('192.168.100.16', 41735) 2015-11-24 17:17:28: it's a test!
('192.168.100.16', 48207) 2015-11-24 17:17:29: it's a test!

嵌入式环境下通过 UDP 链接来调试 QT 程序的更多相关文章

  1. Mac环境下PHPstorm配置xdebug开发调试web程序

    一.安装PHP的xdebug扩展 安装xdebug(技巧,为了找到适配的版本,让xdebug网站根据phpinfo()函数输出分析找到对应的方法及安装步骤:如果安装了多个PHP版本的话,尽量用phpi ...

  2. 在SoCEDS环境下编译和更新preloader和uboot程序的方法

    在SoCEDS环境下编译和更新preloader和uboot程序的方法   前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloade ...

  3. VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序

    下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...

  4. 亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细)

    下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip,不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0- ...

  5. 【最详细最完整】在Linux 下如何打包免安装的QT程序?

    在Linux 下如何打包免安装的QT程序? 版权声明:嵌入式linux相关的文章是我的学习笔记,基于Exynos 4412开发板,一部分内容是总结,一部分是查资料所得,大家可以自由转载,但请注明出处! ...

  6. 交叉编译问题记录-嵌入式环境下 GDB 的使用方法

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10693247.html 本文以嵌入式 Linux 环境下的 gdb 使用为例,记录交叉编 ...

  7. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  8. 【swoole】如何在docker+swoole环境下测试udp服务

    前面几篇文章讲了使用 docker+swoole 环境来测试tcp服务以及如何测试,但是当我开始学习udp服务那块的时候,发现使用原来的方式在 docker+swoole 环境下行不通啦,后来发现如果 ...

  9. win环境下,用虚拟化工具打包Qt动态编译exe的过程(使用Enigma Virtual Box)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://goldlion.blog.51cto.com/4127613/834075 引子 ...

随机推荐

  1. Django admin 显示图片

    我有一个表用来储存轮播图片,有一个 `picture` 字段储存的是图片的url,图片的 url 通过上传文件到 cdn 获得.目前这个表的编辑是通过自定义一个 `ModelForm`,然后重写 Dj ...

  2. 工作随笔——一次简单的Maven加速构建实战

    注意:所有的编译.打包.部署全部是通过Jenkins完成的. 公司内部有一个项目,开始做的时候已经预计到会有很多客服端.所以开发就搞了如下的结构: fft-api # 公用的API,所有的程序都必须使 ...

  3. 本地的html怎么直接通过路径就读取本地文件。

    我要做的事情是已知一个目录的相对路径,获得这个路径下面所有的txt文件,然后读到一个JS Script里面做下一步处理. 网上的例子都是使用input的,既然我是local的html文件,也知道路径了 ...

  4. DOM之parentNode与offsetParent

    DOM中有两个属性parentNode和offsetParent,想必区别大家都是知道的,可用法上还是有一些需要注意的地方,尤其是后者,想知道吗?继续往下看咯. parentNode指的是父节点,el ...

  5. .net程序员转行做手游开发经历(二)

    上篇主要介绍自己个人的经历,这篇主要讲下学习新语言的过程. 上次说到最终选择的语言是swift,框架用spritekit,上次有网友对为什么选择用这俩呢,为什么不用cocos和unity呢,cocos ...

  6. 正则表达式语法(msdn)

    “正则表达式”描述在搜索文本正文时要匹配的一个或多个字符串.该表达式可用作一个将字符模式与要搜索的字符串相匹配的模板. 正则表达式包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符” ...

  7. go linux 学习记录

    1 yum install mercurial 安装mercurial包 2 yum install git 安装git包 3 yum install gcc 安装gcc 4  然后就可以下载gola ...

  8. chgrp 简明笔记

    改变与文件相关联的组 chgrp [options] group file-list 参数 group 为新组的名称或者数值ID,file-list 为要改变其相关联组的文件路径名列表 选项 -c   ...

  9. TP学习笔记一(tp的目录结构 , tp的输出方式)

    一.ThinkPHP的介绍 //了解 MVC M - Model 模型 工作:负责数据的操作 V - View 视图(模板) 工作:负责前台页面显示 C - Controller 控制器(模块) 工作 ...

  10. java虚拟机和Dalvik虚拟机的区别

    java虚拟机和Dalvik虚拟机的区别: java虚拟机Dalvik虚拟机 java虚拟机基于栈. 基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多dalvik虚拟机是基于寄存器的 j ...