VirtualBox

Changeset 103473 in vbox


Ignore:
Timestamp:
Feb 20, 2024 10:09:11 AM (11 months ago)
Author:
vboxsync
Message:

VBoxDbg: Made logging and copying to the clipboard go thru the proxy model so we get what we see (filtered and sorted). bugref:10376

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Debugger/VBoxDbgStatsQt.cpp

    r103466 r103473  
    567567    static void destroyTree(PDBGGUISTATSNODE a_pRoot);
    568568
     569public:
    569570    /**
    570571     * Stringifies exactly one node, no children.
     
    572573     * This is for logging and clipboard.
    573574     *
    574      * @param   a_pNode     The node.
    575      * @param   a_rString   The string to append the stringified node to.
    576      */
    577     static void stringifyNodeNoRecursion(PDBGGUISTATSNODE a_pNode, QString &a_rString);
    578 
     575     * @param   a_pNode         The node.
     576     * @param   a_rString       The string to append the stringified node to.
     577     * @param   a_cchNameWidth  The width of the basename.
     578     */
     579    static void stringifyNodeNoRecursion(PDBGGUISTATSNODE a_pNode, QString &a_rString, size_t a_cchNameWidth);
     580
     581protected:
    579582    /**
    580583     * Stringifies a node and its children.
     
    582585     * This is for logging and clipboard.
    583586     *
    584      * @param   a_pNode     The node.
    585      * @param   a_rString   The string to append the stringified node to.
    586      */
    587     static void stringifyNode(PDBGGUISTATSNODE a_pNode, QString &a_rString);
     587     * @param   a_pNode         The node.
     588     * @param   a_rString       The string to append the stringified node to.
     589     * @param   a_cchNameWidth  The width of the basename.
     590     */
     591    static void stringifyNode(PDBGGUISTATSNODE a_pNode, QString &a_rString, size_t a_cchNameWidth);
    588592
    589593public:
     
    606610    void xmlifyTree(QModelIndex &a_rRoot, QString &a_rString) const;
    607611
    608     /**
    609      * Puts the stringified tree on the clipboard.
    610      *
    611      * @param   a_rRoot         Where to start. Use QModelIndex() to start at the root.
    612      */
    613     void copyTreeToClipboard(QModelIndex &a_rRoot) const;
    614 
    615 
    616 protected:
    617     /** Worker for logTree. */
    618     static void logNode(PDBGGUISTATSNODE a_pNode, bool a_fReleaseLog);
    619 
    620612public:
    621     /** Logs a (sub-)tree.
    622      *
    623      * @param   a_rRoot         Where to start. Use QModelIndex() to start at the root.
    624      * @param   a_fReleaseLog   Whether to use the release log (true) or the debug log (false).
    625      */
    626     void logTree(QModelIndex &a_rRoot, bool a_fReleaseLog) const;
    627613
    628614    /** Gets the unit. */
     
    783769    void notifyFilterChanges();
    784770
     771    /**
     772     * Converts the specified tree to string.
     773     *
     774     * This is for logging and clipboard.
     775     *
     776     * @param   a_rRoot         Where to start. Use QModelIndex() to start at the root.
     777     * @param   a_rString       Where to return to return the string dump.
     778     * @param   a_cchNameWidth  The width of the basename.
     779     */
     780    void stringifyTree(QModelIndex const &a_rRoot, QString &a_rString, size_t a_cchNameWidth = 0) const;
     781
    785782protected:
    786783    /**
    787      * Converts an index to a node pointer.
     784     * Converts a source index to a node pointer.
    788785     *
    789786     * @returns Pointer to the node, NULL if invalid reference.
    790      * @param   a_rIndex        Reference to the index
    791      */
    792     inline PDBGGUISTATSNODE nodeFromIndex(const QModelIndex &a_rIndex) const
    793     {
    794         if (RT_LIKELY(a_rIndex.isValid()))
    795             return (PDBGGUISTATSNODE)a_rIndex.internalPointer();
     787     * @param   a_rSrcIndex     Reference to the source index.
     788     */
     789    inline PDBGGUISTATSNODE nodeFromSrcIndex(const QModelIndex &a_rSrcIndex) const
     790    {
     791        if (RT_LIKELY(a_rSrcIndex.isValid()))
     792            return (PDBGGUISTATSNODE)a_rSrcIndex.internalPointer();
    796793        return NULL;
     794    }
     795
     796    /**
     797     * Converts a proxy index to a node pointer.
     798     *
     799     * @returns Pointer to the node, NULL if invalid reference.
     800     * @param   a_rProxyIndex   The reference to the proxy index.
     801     */
     802    inline PDBGGUISTATSNODE nodeFromProxyIndex(const QModelIndex &a_rProxyIndex) const
     803    {
     804        QModelIndex const SrcIndex = mapToSource(a_rProxyIndex);
     805        return nodeFromSrcIndex(SrcIndex);
    797806    }
    798807
     
    29822991
    29832992/*static*/ void
    2984 VBoxDbgStatsModel::stringifyNodeNoRecursion(PDBGGUISTATSNODE a_pNode, QString &a_rString)
     2993VBoxDbgStatsModel::stringifyNodeNoRecursion(PDBGGUISTATSNODE a_pNode, QString &a_rString, size_t a_cchNameWidth)
    29852994{
    29862995    /*
     
    29902999    ssize_t off = getNodePath(a_pNode, szBuf, sizeof(szBuf) - 2);
    29913000    AssertReturnVoid(off >= 0);
    2992     if (off < 32)
    2993     {
    2994         memset(&szBuf[off], ' ', 32 - off);
    2995         szBuf[32] = '\0';
    2996         off = 32;
    2997     }
    29983001    szBuf[off++] = ' ';
     3002    ssize_t cchPadding = (ssize_t)(a_cchNameWidth - a_pNode->cchName);
     3003    if (off < 32 && 32 - off > cchPadding)
     3004        cchPadding = 32 - off;
     3005    if (cchPadding > 0)
     3006    {
     3007        if (off + (size_t)cchPadding + 1 >= sizeof(szBuf))
     3008            cchPadding = sizeof(szBuf) - off - 1;
     3009        if (cchPadding > 0)
     3010        {
     3011            memset(&szBuf[off], ' ', cchPadding);
     3012            off += (size_t)cchPadding;
     3013        }
     3014    }
    29993015    szBuf[off]   = '\0';
    30003016    a_rString += szBuf;
     
    30083024    {
    30093025        case STAMTYPE_COUNTER:
    3010             RTStrPrintf(szBuf, sizeof(szBuf), "%8llu %s", a_pNode->Data.Counter.c, a_pNode->pszUnit);
     3026            RTStrPrintf(szBuf, sizeof(szBuf), "%'11llu %s", a_pNode->Data.Counter.c, a_pNode->pszUnit);
    30113027            break;
    30123028
     
    30163032            uint64_t u64 = a_pNode->Data.Profile.cPeriods ? a_pNode->Data.Profile.cPeriods : 1;
    30173033            RTStrPrintf(szBuf, sizeof(szBuf),
    3018                         "%8llu %s (%12llu ticks, %7llu times, max %9llu, min %7lld)",
     3034                        "%'11llu %s (%'14llu ticks, %'9llu times, max %'12llu, min %'9lld)",
    30193035                        a_pNode->Data.Profile.cTicks / u64, a_pNode->pszUnit,
    3020                         a_pNode->Data.Profile.cTicks, a_pNode->Data.Profile.cPeriods, a_pNode->Data.Profile.cTicksMax, a_pNode->Data.Profile.cTicksMin);
     3036                        a_pNode->Data.Profile.cTicks, a_pNode->Data.Profile.cPeriods,
     3037                        a_pNode->Data.Profile.cTicksMax, a_pNode->Data.Profile.cTicksMin);
    30213038            break;
    30223039        }
     
    30253042        case STAMTYPE_RATIO_U32_RESET:
    30263043            RTStrPrintf(szBuf, sizeof(szBuf),
    3027                         "%8u:%-8u %s",
     3044                        "%'8u:%-'8u %s",
    30283045                        a_pNode->Data.RatioU32.u32A, a_pNode->Data.RatioU32.u32B, a_pNode->pszUnit);
    30293046            break;
     
    30373054        case STAMTYPE_U8:
    30383055        case STAMTYPE_U8_RESET:
    3039             RTStrPrintf(szBuf, sizeof(szBuf), "%8u %s", a_pNode->Data.u8, a_pNode->pszUnit);
     3056            RTStrPrintf(szBuf, sizeof(szBuf), "%11u %s", a_pNode->Data.u8, a_pNode->pszUnit);
    30403057            break;
    30413058
    30423059        case STAMTYPE_X8:
    30433060        case STAMTYPE_X8_RESET:
    3044             RTStrPrintf(szBuf, sizeof(szBuf), "%8x %s", a_pNode->Data.u8, a_pNode->pszUnit);
     3061            RTStrPrintf(szBuf, sizeof(szBuf), "%11x %s", a_pNode->Data.u8, a_pNode->pszUnit);
    30453062            break;
    30463063
    30473064        case STAMTYPE_U16:
    30483065        case STAMTYPE_U16_RESET:
    3049             RTStrPrintf(szBuf, sizeof(szBuf), "%8u %s", a_pNode->Data.u16, a_pNode->pszUnit);
     3066            RTStrPrintf(szBuf, sizeof(szBuf), "%'11u %s", a_pNode->Data.u16, a_pNode->pszUnit);
    30503067            break;
    30513068
    30523069        case STAMTYPE_X16:
    30533070        case STAMTYPE_X16_RESET:
    3054             RTStrPrintf(szBuf, sizeof(szBuf), "%8x %s", a_pNode->Data.u16, a_pNode->pszUnit);
     3071            RTStrPrintf(szBuf, sizeof(szBuf), "%11x %s", a_pNode->Data.u16, a_pNode->pszUnit);
    30553072            break;
    30563073
    30573074        case STAMTYPE_U32:
    30583075        case STAMTYPE_U32_RESET:
    3059             RTStrPrintf(szBuf, sizeof(szBuf), "%8u %s", a_pNode->Data.u32, a_pNode->pszUnit);
     3076            RTStrPrintf(szBuf, sizeof(szBuf), "%'11u %s", a_pNode->Data.u32, a_pNode->pszUnit);
    30603077            break;
    30613078
    30623079        case STAMTYPE_X32:
    30633080        case STAMTYPE_X32_RESET:
    3064             RTStrPrintf(szBuf, sizeof(szBuf), "%8x %s", a_pNode->Data.u32, a_pNode->pszUnit);
     3081            RTStrPrintf(szBuf, sizeof(szBuf), "%11x %s", a_pNode->Data.u32, a_pNode->pszUnit);
    30653082            break;
    30663083
    30673084        case STAMTYPE_U64:
    30683085        case STAMTYPE_U64_RESET:
    3069             RTStrPrintf(szBuf, sizeof(szBuf), "%8llu %s", a_pNode->Data.u64, a_pNode->pszUnit);
     3086            RTStrPrintf(szBuf, sizeof(szBuf), "%'11llu %s", a_pNode->Data.u64, a_pNode->pszUnit);
    30703087            break;
    30713088
    30723089        case STAMTYPE_X64:
    30733090        case STAMTYPE_X64_RESET:
    3074             RTStrPrintf(szBuf, sizeof(szBuf), "%8llx %s", a_pNode->Data.u64, a_pNode->pszUnit);
     3091            RTStrPrintf(szBuf, sizeof(szBuf), "%'11llx %s", a_pNode->Data.u64, a_pNode->pszUnit);
    30753092            break;
    30763093
     
    30903107
    30913108/*static*/ void
    3092 VBoxDbgStatsModel::stringifyNode(PDBGGUISTATSNODE a_pNode, QString &a_rString)
     3109VBoxDbgStatsModel::stringifyNode(PDBGGUISTATSNODE a_pNode, QString &a_rString, size_t a_cchNameWidth)
    30933110{
    30943111    /* this node (if it has data) */
     
    30973114        if (!a_rString.isEmpty())
    30983115            a_rString += "\n";
    3099         stringifyNodeNoRecursion(a_pNode, a_rString);
     3116        stringifyNodeNoRecursion(a_pNode, a_rString, a_cchNameWidth);
    31003117    }
    31013118
    31023119    /* the children */
    31033120    uint32_t const cChildren = a_pNode->cChildren;
     3121    a_cchNameWidth = 0;
    31043122    for (uint32_t i = 0; i < cChildren; i++)
    3105         stringifyNode(a_pNode->papChildren[i], a_rString);
     3123        if (a_cchNameWidth < a_pNode->papChildren[i]->cchName)
     3124            a_cchNameWidth = a_pNode->papChildren[i]->cchName;
     3125    for (uint32_t i = 0; i < cChildren; i++)
     3126        stringifyNode(a_pNode->papChildren[i], a_rString, a_cchNameWidth);
    31063127}
    31073128
     
    31123133    PDBGGUISTATSNODE pRoot = a_rRoot.isValid() ? nodeFromIndex(a_rRoot) : m_pRoot;
    31133134    if (pRoot)
    3114         stringifyNode(pRoot, a_rString);
    3115 }
    3116 
    3117 
    3118 void
    3119 VBoxDbgStatsModel::copyTreeToClipboard(QModelIndex &a_rRoot) const
    3120 {
    3121     QString String;
    3122     stringifyTree(a_rRoot, String);
    3123 
    3124     QClipboard *pClipboard = QApplication::clipboard();
    3125     if (pClipboard)
    3126         pClipboard->setText(String, QClipboard::Clipboard);
    3127 }
    3128 
    3129 
    3130 /*static*/ void
    3131 VBoxDbgStatsModel::logNode(PDBGGUISTATSNODE a_pNode, bool a_fReleaseLog)
    3132 {
    3133     /* this node (if it has data) */
    3134     if (a_pNode->enmType != STAMTYPE_INVALID)
    3135     {
    3136         QString SelfStr;
    3137         stringifyNodeNoRecursion(a_pNode, SelfStr);
    3138         QByteArray SelfByteArray = SelfStr.toUtf8();
    3139         if (a_fReleaseLog)
    3140             RTLogRelPrintf("%s\n", SelfByteArray.constData());
    3141         else
    3142             RTLogPrintf("%s\n", SelfByteArray.constData());
    3143     }
    3144 
    3145     /* the children */
    3146     uint32_t const cChildren = a_pNode->cChildren;
    3147     for (uint32_t i = 0; i < cChildren; i++)
    3148         logNode(a_pNode->papChildren[i], a_fReleaseLog);
    3149 }
    3150 
    3151 
    3152 void
    3153 VBoxDbgStatsModel::logTree(QModelIndex &a_rRoot, bool a_fReleaseLog) const
    3154 {
    3155     PDBGGUISTATSNODE pRoot = a_rRoot.isValid() ? nodeFromIndex(a_rRoot) : m_pRoot;
    3156     if (pRoot)
    3157         logNode(pRoot, a_fReleaseLog);
     3135        stringifyNode(pRoot, a_rString, 0);
    31583136}
    31593137
     
    33993377     * Locate the node.
    34003378     */
    3401     PDBGGUISTATSNODE pParent = nodeFromIndex(a_rSrcParent);
     3379    PDBGGUISTATSNODE pParent = nodeFromSrcIndex(a_rSrcParent);
    34023380    if (pParent)
    34033381    {
     
    35283506VBoxDbgStatsSortFileProxyModel::lessThan(const QModelIndex &a_rSrcLeft, const QModelIndex &a_rSrcRight) const
    35293507{
    3530     PCDBGGUISTATSNODE const pLeft  = nodeFromIndex(a_rSrcLeft);
    3531     PCDBGGUISTATSNODE const pRight = nodeFromIndex(a_rSrcRight);
     3508    PCDBGGUISTATSNODE const pLeft  = nodeFromSrcIndex(a_rSrcLeft);
     3509    PCDBGGUISTATSNODE const pRight = nodeFromSrcIndex(a_rSrcRight);
    35323510    if (pLeft == pRight)
    35333511        return false;
     
    35913569
    35923570
     3571void
     3572VBoxDbgStatsSortFileProxyModel::stringifyTree(QModelIndex const &a_rRoot, QString &a_rString, size_t a_cchNameWidth) const
     3573{
     3574    /* The node itself. */
     3575    PDBGGUISTATSNODE pNode = nodeFromProxyIndex(a_rRoot);
     3576    if (pNode)
     3577    {
     3578        if (pNode->enmType != STAMTYPE_INVALID)
     3579        {
     3580            if (!a_rString.isEmpty())
     3581                a_rString += "\n";
     3582            VBoxDbgStatsModel::stringifyNodeNoRecursion(pNode, a_rString, a_cchNameWidth);
     3583        }
     3584    }
     3585
     3586    /* The children. */
     3587    int const cChildren = rowCount(a_rRoot);
     3588    if (cChildren > 0)
     3589    {
     3590        a_cchNameWidth = 0;
     3591        for (int iChild = 0; iChild < cChildren; iChild++)
     3592        {
     3593            QModelIndex const ChildIdx = index(iChild, 0, a_rRoot);
     3594            pNode = nodeFromProxyIndex(ChildIdx);
     3595            if (pNode && a_cchNameWidth < pNode->cchName)
     3596                a_cchNameWidth = pNode->cchName;
     3597        }
     3598
     3599        for (int iChild = 0; iChild < cChildren; iChild++)
     3600        {
     3601            QModelIndex const ChildIdx = index(iChild, 0, a_rRoot);
     3602            stringifyTree(ChildIdx, a_rString, a_cchNameWidth);
     3603        }
     3604    }
     3605}
     3606
    35933607#endif /* VBOXDBG_WITH_SORTED_AND_FILTERED_STATS */
    35943608
     
    39843998{
    39853999    QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
     4000
     4001    QString     String;
    39864002    if (m_pProxyModel)
    3987         Idx = m_pProxyModel->mapToSource(Idx);
    3988     m_pVBoxModel->copyTreeToClipboard(Idx);
     4003        m_pProxyModel->stringifyTree(Idx, String);
     4004    else
     4005        m_pVBoxModel->stringifyTree(Idx, String);
     4006
     4007    QClipboard *pClipboard = QApplication::clipboard();
     4008    if (pClipboard)
     4009        pClipboard->setText(String, QClipboard::Clipboard);
    39894010}
    39904011
     
    39944015{
    39954016    QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
     4017
     4018    QString     String;
    39964019    if (m_pProxyModel)
    3997         Idx = m_pProxyModel->mapToSource(Idx);
    3998     m_pVBoxModel->logTree(Idx, false /* a_fReleaseLog */);
     4020        m_pProxyModel->stringifyTree(Idx, String);
     4021    else
     4022        m_pVBoxModel->stringifyTree(Idx, String);
     4023
     4024    QByteArray SelfByteArray = String.toUtf8();
     4025    RTLogPrintf("%s\n", SelfByteArray.constData());
    39994026}
    40004027
     
    40044031{
    40054032    QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
     4033
     4034    QString     String;
    40064035    if (m_pProxyModel)
    4007         Idx = m_pProxyModel->mapToSource(Idx);
    4008     m_pVBoxModel->logTree(Idx, true /* a_fReleaseLog */);
     4036        m_pProxyModel->stringifyTree(Idx, String);
     4037    else
     4038        m_pVBoxModel->stringifyTree(Idx, String);
     4039
     4040    QByteArray SelfByteArray = String.toUtf8();
     4041    RTLogRelPrintf("%s\n", SelfByteArray.constData());
    40094042}
    40104043
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette