VirtualBox

Changeset 55885 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
May 16, 2015 1:03:11 PM (10 years ago)
Author:
vboxsync
Message:

IMachineDebugger: Added a queryOSKernelLog method.

Location:
trunk/src/VBox/Main
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r55883 r55885  
    1716417164  <interface
    1716517165    name="IMachineDebugger" extends="$unknown"
    17166     uuid="b08d5aa9-4e35-3a17-2e4d-61948b590989"
     17166    uuid="ae7afb78-4265-8c03-ccb9-33a7970057e3"
    1716717167    wsmap="managed"
    1716817168    >
     
    1737917379    </method>
    1738017380
     17381    <method name="queryOSKernelLog">
     17382      <desc>
     17383        Tries to get the kernel log (dmesg) of the guest OS.
     17384
     17385      </desc>
     17386      <param name="maxMessages" type="unsigned long" dir="in">
     17387        <desc>Max number of messages to return, counting from the end of the
     17388          log.  If 0, there is no limit.</desc>
     17389      </param>
     17390      <param name="dmesg" type="wstring" dir="return">
     17391        <desc>
     17392          The kernel log.
     17393        </desc>
     17394      </param>
     17395    </method>
     17396
    1738117397    <method name="getRegister">
    1738217398      <desc>
    1738317399        Gets one register.
    17384 
    17385         This feature is not implemented in the 4.0.0 release but may show up
    17386         in a dot release.
    1738717400      </desc>
    1738817401      <param name="cpuId" type="unsigned long" dir="in">
     
    1740317416      <desc>
    1740417417        Gets all the registers for the given CPU.
    17405 
    17406         This feature is not implemented in the 4.0.0 release but may show up
    17407         in a dot release.
    1740817418      </desc>
    1740917419      <param name="cpuId" type="unsigned long" dir="in">
  • trunk/src/VBox/Main/include/MachineDebuggerImpl.h

    r55883 r55885  
    107107    HRESULT unloadPlugIn(const com::Utf8Str &aName);
    108108    HRESULT detectOS(com::Utf8Str &aOs);
     109    HRESULT queryOSKernelLog(ULONG aMaxMessages,
     110                             com::Utf8Str &aDmesg);
    109111    HRESULT getRegister(ULONG aCpuId,
    110112                        const com::Utf8Str &aName,
  • trunk/src/VBox/Main/src-client/MachineDebuggerImpl.cpp

    r55883 r55885  
    11831183        else
    11841184            hrc = setError(VBOX_E_VM_ERROR, tr("DBGFR3OSDetect failed with %Rrc"), vrc);
     1185    }
     1186    return hrc;
     1187}
     1188
     1189HRESULT MachineDebugger::queryOSKernelLog(ULONG aMaxMessages, com::Utf8Str &aDmesg)
     1190{
     1191    /*
     1192     * Lock the debugger and get the VM pointer
     1193     */
     1194    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     1195    Console::SafeVMPtr ptrVM(mParent);
     1196    HRESULT hrc = ptrVM.rc();
     1197    if (SUCCEEDED(hrc))
     1198    {
     1199        PDBGFOSIDMESG pDmesg = (PDBGFOSIDMESG)DBGFR3OSQueryInterface(ptrVM.rawUVM(), DBGFOSINTERFACE_DMESG);
     1200        if (pDmesg)
     1201        {
     1202            size_t   cbActual;
     1203            size_t   cbBuf  = _512K;
     1204            int vrc = aDmesg.reserveNoThrow(cbBuf);
     1205            if (RT_SUCCESS(vrc))
     1206            {
     1207                uint32_t cMessages = aMaxMessages == 0 ? UINT32_MAX : aMaxMessages;
     1208                vrc = pDmesg->pfnQueryKernelLog(pDmesg, ptrVM.rawUVM(), 0 /*fFlags*/, cMessages,
     1209                                                aDmesg.mutableRaw(), cbBuf, &cbActual);
     1210
     1211                uint32_t cTries = 10;
     1212                while (vrc == VERR_BUFFER_OVERFLOW && cbBuf < 16*_1M && cTries-- > 0)
     1213                {
     1214                    cbBuf = RT_ALIGN_Z(cbActual + _4K, _4K);
     1215                    int vrc = aDmesg.reserveNoThrow(cbBuf);
     1216                    if (RT_SUCCESS(vrc))
     1217                        vrc = pDmesg->pfnQueryKernelLog(pDmesg, ptrVM.rawUVM(), 0 /*fFlags*/, cMessages,
     1218                                                        aDmesg.mutableRaw(), cbBuf, &cbActual);
     1219                }
     1220                if (RT_SUCCESS(vrc))
     1221                    aDmesg.jolt();
     1222                else if (vrc == VERR_BUFFER_OVERFLOW)
     1223                    hrc = setError(E_FAIL, "Too much log available, must use the maxMessages parameter to restrict.");
     1224                else
     1225                    hrc = setErrorVrc(vrc);
     1226            }
     1227            else
     1228                hrc = setErrorBoth(E_OUTOFMEMORY, vrc);
     1229        }
     1230        else
     1231            hrc = setError(E_FAIL, "The dmesg interface isn't implemented by guest OS digger, or detectOS() has not been called.");
    11851232    }
    11861233    return hrc;
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