据说有为嵌入式提供的 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(0); } QUdpSocket *udpSocket = new QUdpSocket(); //udpSocket->bind( QHostAddress("192.168.100.14"), 11334 ); udpSocket->bind(QHostAddress(), 11334, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint); QHostAddress hostaddr; hostaddr.setAddress( "255.255.255.255" ); udpSocket->writeDatagram( qstrTest.toAscii(), hostaddr, 12345 ); udpSocket->close(); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qInstallMsgHandler(networkLog); qDebug()<<"qDebug(), hello QT!"; printf("printf, hello QT! "); while(1) { qDebug()<<"it's a test!"; std::cout<<"cout, hello QT!"<<std::endl; ::sleep(1); } 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!