嵌入式环境下通过 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(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! 
原文地址:https://www.cnblogs.com/pied/p/4992200.html