• 嵌入式环境下通过 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
Copyright © 2020-2023  润新知