嵌入式环境下通过 UDP 链接来调试 QT 程序
据说有为嵌入式提供的 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 程序的更多相关文章
- Mac环境下PHPstorm配置xdebug开发调试web程序
一.安装PHP的xdebug扩展 安装xdebug(技巧,为了找到适配的版本,让xdebug网站根据phpinfo()函数输出分析找到对应的方法及安装步骤:如果安装了多个PHP版本的话,尽量用phpi ...
- 在SoCEDS环境下编译和更新preloader和uboot程序的方法
在SoCEDS环境下编译和更新preloader和uboot程序的方法 前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloade ...
- VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...
- 亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细)
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip,不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0- ...
- 【最详细最完整】在Linux 下如何打包免安装的QT程序?
在Linux 下如何打包免安装的QT程序? 版权声明:嵌入式linux相关的文章是我的学习笔记,基于Exynos 4412开发板,一部分内容是总结,一部分是查资料所得,大家可以自由转载,但请注明出处! ...
- 交叉编译问题记录-嵌入式环境下 GDB 的使用方法
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10693247.html 本文以嵌入式 Linux 环境下的 gdb 使用为例,记录交叉编 ...
- Docker容器环境下ASP.NET Core Web API应用程序的调试
本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...
- 【swoole】如何在docker+swoole环境下测试udp服务
前面几篇文章讲了使用 docker+swoole 环境来测试tcp服务以及如何测试,但是当我开始学习udp服务那块的时候,发现使用原来的方式在 docker+swoole 环境下行不通啦,后来发现如果 ...
- win环境下,用虚拟化工具打包Qt动态编译exe的过程(使用Enigma Virtual Box)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://goldlion.blog.51cto.com/4127613/834075 引子 ...
随机推荐
- VMware Fusion 中如何复制centos/linux虚拟机
今天想在mac本上,弄几个centos的虚拟机,尝试搭建hadoop的全分布环境.一台台虚拟机安装过去太麻烦了,想直接将现有的centos虚拟机复制几份完事,但是复制出来的虚拟机无法上网,折腾了一翻, ...
- WP7开发 Sqlite数据库的使用 解决Unable open the database
WP7本身不支持Sqlite数据库,但我们可以添加第三方组件让它支持Sqlite. 首先在项目中添加引用Community.CsharpSqlite.WP.dll,我会放后面让大家下载,我下了有几天了 ...
- vbs外部调用
一.QTP调用外部VBS的方法 加到QTP的Resource中 在QTP菜单中设置, 菜单FileàSettingsàResource,将要加载的VB脚本添加进来. 举例: 步骤1:在D盘下新建一个V ...
- swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者
Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...
- Struts2 动态结果和带参数的跳转
完整代码:Struts16ActionResultsDemo.rar 1.动态结果. 有时我们需要在Action里取得我个要转跳的页面 看一下我们的struts.xml <?xml versio ...
- LINQ的高级应用
---恢复内容开始--- 本文不想罗列linq的通俗使用方法.因为很多博文都已经写得很详细了. 此处直接贴出源码,如果有需要的朋友可以参考,希望更多的朋友能够补充更多的linq的高级应用. 源码如下: ...
- 似魔鬼的 『 document.write 』
在平时的工作中,楼主很少用 document.write 方法,一直觉得 document.write 是个危险的方法.楼主不用,并不代表别人不用,最近给维护的项目添了一点代码,更加深了我对 &quo ...
- 【语言基础】c++ 备忘录
1. C++ 整数类型范围 可以参照头文件limits.h定义的宏 #define INT_MAX 2147483647(32bit, 最大10位十进制) #define UINT_MAX ...
- Qt环境搭建(Qt Creator)+Visual Studio
1.http://www.cnblogs.com/ranjiewen/p/5318768.html 简述 经常有人问我编写Qt程序时使用什么IDE,其实这个真的很难回答(各有所长),只能说看个人爱好了 ...
- go println与printf区别
Println 与Printf 都是fmt 包中的公共方法 Println :可以打印出字符串,和变量: Printf : 只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整形变量和整 ...