VirtualBox

Changeset 61561 in vbox


Ignore:
Timestamp:
Jun 8, 2016 8:37:19 AM (8 years ago)
Author:
vboxsync
Message:

Main: Implement IMachineDebugger::dumpGuestStack (implementation blatantly copied from the CodeView debugger implementation)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-client/MachineDebuggerImpl.cpp

    r61349 r61561  
    13501350HRESULT MachineDebugger::dumpGuestStack(ULONG aCpuId, com::Utf8Str &aStack)
    13511351{
    1352     ReturnComNotImplemented();
     1352    /*
     1353     * The prologue.
     1354     */
     1355    LogFlowThisFunc(("\n"));
     1356    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     1357    Console::SafeVMPtr ptrVM(mParent);
     1358    HRESULT hrc = ptrVM.rc();
     1359    if (SUCCEEDED(hrc))
     1360    {
     1361        PCDBGFSTACKFRAME pFirstFrame;
     1362
     1363        int vrc = DBGFR3StackWalkBegin(ptrVM.rawUVM(), aCpuId, DBGFCODETYPE_GUEST, &pFirstFrame);
     1364        if (RT_SUCCESS(vrc))
     1365        {
     1366            /*
     1367             * Print header.
     1368             */
     1369            try
     1370            {
     1371                uint32_t fBitFlags = 0;
     1372                for (PCDBGFSTACKFRAME pFrame = pFirstFrame;
     1373                     pFrame;
     1374                     pFrame = DBGFR3StackWalkNext(pFrame))
     1375                {
     1376                    uint32_t const fCurBitFlags = pFrame->fFlags & (DBGFSTACKFRAME_FLAGS_16BIT | DBGFSTACKFRAME_FLAGS_32BIT | DBGFSTACKFRAME_FLAGS_64BIT);
     1377                    if (fCurBitFlags & DBGFSTACKFRAME_FLAGS_16BIT)
     1378                    {
     1379                        if (fCurBitFlags != fBitFlags)
     1380                            aStack.append("SS:BP     Ret SS:BP Ret CS:EIP    Arg0     Arg1     Arg2     Arg3     CS:EIP / Symbol [line]\n");
     1381                        aStack.append(Utf8StrFmt("%04RX16:%04RX16 %04RX16:%04RX16 %04RX32:%08RX32 %08RX32 %08RX32 %08RX32 %08RX32",
     1382                                                 pFrame->AddrFrame.Sel,
     1383                                                 (uint16_t)pFrame->AddrFrame.off,
     1384                                                 pFrame->AddrReturnFrame.Sel,
     1385                                                 (uint16_t)pFrame->AddrReturnFrame.off,
     1386                                                 (uint32_t)pFrame->AddrReturnPC.Sel,
     1387                                                 (uint32_t)pFrame->AddrReturnPC.off,
     1388                                                 pFrame->Args.au32[0],
     1389                                                 pFrame->Args.au32[1],
     1390                                                 pFrame->Args.au32[2],
     1391                                                 pFrame->Args.au32[3]));
     1392                    }
     1393                    else if (fCurBitFlags & DBGFSTACKFRAME_FLAGS_32BIT)
     1394                    {
     1395                        if (fCurBitFlags != fBitFlags)
     1396                            aStack.append("EBP      Ret EBP  Ret CS:EIP    Arg0     Arg1     Arg2     Arg3     CS:EIP / Symbol [line]\n");
     1397                        aStack.append(Utf8StrFmt("%08RX32 %08RX32 %04RX32:%08RX32 %08RX32 %08RX32 %08RX32 %08RX32",
     1398                                                 (uint32_t)pFrame->AddrFrame.off,
     1399                                                 (uint32_t)pFrame->AddrReturnFrame.off,
     1400                                                 (uint32_t)pFrame->AddrReturnPC.Sel,
     1401                                                 (uint32_t)pFrame->AddrReturnPC.off,
     1402                                                 pFrame->Args.au32[0],
     1403                                                 pFrame->Args.au32[1],
     1404                                                 pFrame->Args.au32[2],
     1405                                                 pFrame->Args.au32[3]));
     1406                    }
     1407                    else if (fCurBitFlags & DBGFSTACKFRAME_FLAGS_64BIT)
     1408                    {
     1409                        if (fCurBitFlags != fBitFlags)
     1410                            aStack.append("RBP              Ret SS:RBP            Ret RIP          CS:RIP / Symbol [line]\n");
     1411                        aStack.append(Utf8StrFmt("%016RX64 %04RX16:%016RX64 %016RX64",
     1412                                                 (uint64_t)pFrame->AddrFrame.off,
     1413                                                 pFrame->AddrReturnFrame.Sel,
     1414                                                 (uint64_t)pFrame->AddrReturnFrame.off,
     1415                                                 (uint64_t)pFrame->AddrReturnPC.off));
     1416                    }
     1417
     1418                    if (!pFrame->pSymPC)
     1419                        aStack.append(Utf8StrFmt(fCurBitFlags & DBGFSTACKFRAME_FLAGS_64BIT
     1420                                                 ? " %RTsel:%016RGv"
     1421                                                 : fCurBitFlags & DBGFSTACKFRAME_FLAGS_32BIT
     1422                                                 ? " %RTsel:%08RGv"
     1423                                                 : " %RTsel:%04RGv"
     1424                                                 , pFrame->AddrPC.Sel, pFrame->AddrPC.off));
     1425                    else
     1426                    {
     1427                        RTGCINTPTR offDisp = pFrame->AddrPC.FlatPtr - pFrame->pSymPC->Value; /** @todo this isn't 100% correct for segmented stuff. */
     1428                        if (offDisp > 0)
     1429                            aStack.append(Utf8StrFmt(" %s+%llx", pFrame->pSymPC->szName, (int64_t)offDisp));
     1430                        else if (offDisp < 0)
     1431                            aStack.append(Utf8StrFmt(" %s-%llx", pFrame->pSymPC->szName, -(int64_t)offDisp));
     1432                        else
     1433                            aStack.append(Utf8StrFmt(" %s", pFrame->pSymPC->szName));
     1434                    }
     1435                    if (pFrame->pLinePC)
     1436                        aStack.append(Utf8StrFmt(" [%s @ 0i%d]", pFrame->pLinePC->szFilename, pFrame->pLinePC->uLineNo));
     1437                    aStack.append(Utf8StrFmt("\n"));
     1438
     1439                    fBitFlags = fCurBitFlags;
     1440                }
     1441            }
     1442            catch (std::bad_alloc)
     1443            {
     1444                hrc = E_OUTOFMEMORY;
     1445            }
     1446
     1447            DBGFR3StackWalkEnd(pFirstFrame);
     1448        }
     1449        else
     1450            hrc = setError(E_FAIL, tr("DBGFR3StackWalkBegin failed with %Rrc"), vrc);
     1451    }
     1452
     1453    return hrc;
    13531454}
    13541455
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