DBGCCommands.cpp revision 5dd0f48aea5b772d5b217101f71606345feb8d3b
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * DBGC - Debugger Console, Native Commands.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * Copyright (C) 2006-2011 Oracle Corporation
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * This file is part of VirtualBox Open Source Edition (OSE), as
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * available from http://www.virtualbox.org. This file is free software;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * you can redistribute it and/or modify it under the terms of the GNU
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * General Public License (GPL) as published by the Free Software
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * Foundation, in version 2 as it comes in the "COPYING" file of the
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/*******************************************************************************
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk* Header Files *
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk*******************************************************************************/
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/*******************************************************************************
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk* Internal Functions *
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk*******************************************************************************/
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdHelp(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdQuit(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdStop(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdDetect(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdCpu(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdInfo(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdLog(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdLogDest(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdLogFlags(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdFormat(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdLoadImage(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdLoadMap(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdLoadSeg(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdLoadSyms(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdSet(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdUnset(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdLoadVars(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdShowVars(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdLoadPlugIn(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdUnloadPlugIn(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdShowPlugIns(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdHarakiri(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdEcho(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdRunScript(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic DECLCALLBACK(int) dbgcCmdWriteCore(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/*******************************************************************************
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk* Global Variables *
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk*******************************************************************************/
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** One argument of any kind. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, 1, DBGCVAR_CAT_ANY, 0, "var", "Any type of argument." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** Multiple string arguments (min 1). */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, ~0U, DBGCVAR_CAT_STRING, 0, "strings", "One or more strings." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** Filename string. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_STRING, 0, "path", "Filename string." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** 'cpu' arguments. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, 1, DBGCVAR_CAT_NUMBER_NO_RANGE, 0, "idCpu", "CPU ID" },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** 'help' arguments. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, ~0U, DBGCVAR_CAT_STRING, 0, "cmd/op", "Zero or more command or operator names." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** 'info' arguments. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_STRING, 0, "info", "The name of the info to display." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, 1, DBGCVAR_CAT_STRING, 0, "args", "String arguments to the handler." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** loadimage arguments. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_STRING, 0, "filename", "Filename string." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_POINTER, 0, "address", "The module address." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, 1, DBGCVAR_CAT_STRING, 0, "name", "The module name. (optional)" },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** loadmap arguments. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_STRING, 0, "filename", "Filename string." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_POINTER, DBGCVD_FLAGS_DEP_PREV, "address", "The module address." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, 1, DBGCVAR_CAT_STRING, DBGCVD_FLAGS_DEP_PREV, "name", "The module name. Empty string means default. (optional)" },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, 1, DBGCVAR_CAT_NUMBER, DBGCVD_FLAGS_DEP_PREV, "subtrahend", "Value to subtract from the addresses in the map file to rebase it correctly to address. (optional)" },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, 1, DBGCVAR_CAT_NUMBER, DBGCVD_FLAGS_DEP_PREV, "seg", "The module segment number (0-based). (optional)" },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** loadseg arguments. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_STRING, 0, "filename", "Filename string." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_POINTER, 0, "address", "The module address." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_NUMBER, 0, "seg", "The module segment number (0-based)." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, 1, DBGCVAR_CAT_STRING, DBGCVD_FLAGS_DEP_PREV, "name", "The module name. Empty string means default. (optional)" },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** loadsyms arguments. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_STRING, 0, "path", "Filename string." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, 1, DBGCVAR_CAT_NUMBER, 0, "delta", "Delta to add to the loaded symbols. (optional)" },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, 1, DBGCVAR_CAT_STRING, 0, "module name", "Module name. (optional)" },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, 1, DBGCVAR_CAT_POINTER, DBGCVD_FLAGS_DEP_PREV, "module address", "Module address. (optional)" },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 0, 1, DBGCVAR_CAT_NUMBER, 0, "module size", "The module size. (optional)" },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** log arguments. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_STRING, 0, "groups", "Group modifier string (quote it!)." }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** logdest arguments. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_STRING, 0, "dests", "Destination modifier string (quote it!)." }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** logflags arguments. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_STRING, 0, "flags", "Flag modifier string (quote it!)." }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** loadplugin, unloadplugin. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, ~0U, DBGCVAR_CAT_STRING, 0, "plugin", "Plug-in name or filename." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** 'set' arguments */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_STRING, 0, "var", "Variable name." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_ANY, 0, "value", "Value to assign to the variable." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** writecore arguments. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* cTimesMin, cTimesMax, enmCategory, fFlags, pszName, pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { 1, 1, DBGCVAR_CAT_STRING, 0, "path", "Filename string." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** Command descriptors for the basic commands. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* pszCmd, cArgsMin, cArgsMax, paArgDescs, cArgDescs, fFlags, pfnHandler pszSyntax, ....pszDescription */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "bye", 0, 0, NULL, 0, 0, dbgcCmdQuit, "", "Exits the debugger." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "cpu", 0, 1, &g_aArgCpu[0], RT_ELEMENTS(g_aArgCpu), 0, dbgcCmdCpu, "[idCpu]", "If no argument, display the current CPU, else change to the specified CPU." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "echo", 1, ~0U, &g_aArgMultiStr[0], RT_ELEMENTS(g_aArgMultiStr), 0, dbgcCmdEcho, "<str1> [str2..[strN]]", "Displays the strings separated by one blank space and the last one followed by a newline." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "exit", 0, 0, NULL, 0, 0, dbgcCmdQuit, "", "Exits the debugger." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "format", 1, 1, &g_aArgAny[0], RT_ELEMENTS(g_aArgAny), 0, dbgcCmdFormat, "", "Evaluates an expression and formats it." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "detect", 0, 0, NULL, 0, 0, dbgcCmdDetect, "", "Detects or re-detects the guest os and starts the OS specific digger." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "harakiri", 0, 0, NULL, 0, 0, dbgcCmdHarakiri, "", "Kills debugger process." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "help", 0, ~0U, &g_aArgHelp[0], RT_ELEMENTS(g_aArgHelp), 0, dbgcCmdHelp, "[cmd/op [..]]", "Display help. For help about info items try 'info help'." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "info", 1, 2, &g_aArgInfo[0], RT_ELEMENTS(g_aArgInfo), 0, dbgcCmdInfo, "<info> [args]", "Display info register in the DBGF. For a list of info items try 'info help'." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "loadimage", 2, 3, &g_aArgLoadImage[0], RT_ELEMENTS(g_aArgLoadImage), 0, dbgcCmdLoadImage, "<filename> <address> [name]",
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk "Loads the symbols of an executable image at the specified address. "
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /*"Optionally giving the module a name other than the file name stem."*/ }, /** @todo implement line breaks */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "loadmap", 2, 5, &g_aArgLoadMap[0], RT_ELEMENTS(g_aArgLoadMap), 0, dbgcCmdLoadMap, "<filename> <address> [name] [subtrahend] [seg]",
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk "Loads the symbols from a map file, usually at a specified address. "
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /*"Optionally giving the module a name other than the file name stem "
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk "and a subtrahend to subtract from the addresses."*/ },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "loadplugin", 1, 1, &g_aArgPlugIn[0], RT_ELEMENTS(g_aArgPlugIn), 0, dbgcCmdLoadPlugIn,"<plugin1> [plugin2..N]", "Loads one or more plugins" },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "loadseg", 3, 4, &g_aArgLoadSeg[0], RT_ELEMENTS(g_aArgLoadSeg), 0, dbgcCmdLoadSeg, "<filename> <address> <seg> [name]",
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk "Loads the symbols of a segment in the executable image at the specified address. "
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /*"Optionally giving the module a name other than the file name stem."*/ },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "loadsyms", 1, 5, &g_aArgLoadSyms[0], RT_ELEMENTS(g_aArgLoadSyms), 0, dbgcCmdLoadSyms, "<filename> [delta] [module] [module address]", "Loads symbols from a text file. Optionally giving a delta and a module." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "loadvars", 1, 1, &g_aArgFilename[0], RT_ELEMENTS(g_aArgFilename), 0, dbgcCmdLoadVars, "<filename>", "Load variables from file. One per line, same as the args to the set command." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "log", 1, 1, &g_aArgLog[0], RT_ELEMENTS(g_aArgLog), 0, dbgcCmdLog, "<group string>", "Modifies the logging group settings (VBOX_LOG)" },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "logdest", 1, 1, &g_aArgLogDest[0], RT_ELEMENTS(g_aArgLogDest), 0, dbgcCmdLogDest, "<dest string>", "Modifies the logging destination (VBOX_LOG_DEST)." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "logflags", 1, 1, &g_aArgLogFlags[0], RT_ELEMENTS(g_aArgLogFlags), 0, dbgcCmdLogFlags, "<flags string>", "Modifies the logging flags (VBOX_LOG_FLAGS)." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "quit", 0, 0, NULL, 0, 0, dbgcCmdQuit, "", "Exits the debugger." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "runscript", 1, 1, &g_aArgFilename[0], RT_ELEMENTS(g_aArgFilename), 0, dbgcCmdRunScript, "<filename>", "Runs the command listed in the script. Lines starting with '#' "
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk "(after removing blanks) are comment. blank lines are ignored. Stops on failure." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "set", 2, 2, &g_aArgSet[0], RT_ELEMENTS(g_aArgSet), 0, dbgcCmdSet, "<var> <value>", "Sets a global variable." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "showplugins",0, 0, NULL, 0, 0, dbgcCmdShowPlugIns,"", "List loaded plugins." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "showvars", 0, 0, NULL, 0, 0, dbgcCmdShowVars, "", "List all the defined variables." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "stop", 0, 0, NULL, 0, 0, dbgcCmdStop, "", "Stop execution." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "unloadplugin", 1, ~0U, &g_aArgPlugIn[0], RT_ELEMENTS(g_aArgPlugIn), 0, dbgcCmdUnloadPlugIn, "<plugin1> [plugin2..N]", "Unloads one or more plugins." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "unset", 1, ~0U, &g_aArgMultiStr[0], RT_ELEMENTS(g_aArgMultiStr), 0, dbgcCmdUnset, "<var1> [var1..[varN]]", "Unsets (delete) one or more global variables." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk { "writecore", 1, 1, &g_aArgWriteCore[0], RT_ELEMENTS(g_aArgWriteCore), 0, dbgcCmdWriteCore, "<filename>", "Write core to file." },
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** The number of native commands. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * Pointer to head of the list of external commands.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkstatic PDBGCEXTCMDS g_pExtCmdsHead; /** @todo rw protect g_pExtCmdsHead! */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** Locks the g_pExtCmdsHead list for reading. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk#define DBGCEXTCMDS_LOCK_RD() do { } while (0)
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** Locks the g_pExtCmdsHead list for writing. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk#define DBGCEXTCMDS_LOCK_WR() do { } while (0)
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** UnLocks the g_pExtCmdsHead list after reading. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk#define DBGCEXTCMDS_UNLOCK_RD() do { } while (0)
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/** UnLocks the g_pExtCmdsHead list after writing. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk#define DBGCEXTCMDS_UNLOCK_WR() do { } while (0)
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * Finds a routine.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * @returns Pointer to the command descriptor.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * If the request was for an external command, the caller is responsible for
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * unlocking the external command list.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * @returns NULL if not found.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * @param pDbgc The debug console instance.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * @param pachName Pointer to the routine string (not terminated).
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * @param cchName Length of the routine name.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * @param fExternal Whether or not the routine is external.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkPCDBGCCMD dbgcRoutineLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal)
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /* emulation first, so commands can be overloaded (info ++). */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk while (cLeft-- > 0)
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk for (unsigned iCmd = 0; iCmd < RT_ELEMENTS(g_aCmds); iCmd++)
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk if ( !strncmp(pachName, g_aCmds[iCmd].pszCmd, cchName)
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk for (PDBGCEXTCMDS pExtCmds = g_pExtCmdsHead; pExtCmds; pExtCmds = pExtCmds->pNext)
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk for (unsigned iCmd = 0; iCmd < pExtCmds->cCmds; iCmd++)
return NULL;
while (pCur)
return VWRN_DBGC_ALREADY_REGISTERED;
int rc = 0;
if (pCur)
return rc;
while (pCur)
if (pPrev)
return VINF_SUCCESS;
int rc;
rc = pCmdHlp->pfnPrintf(pCmdHlp, NULL, " <%u-%u>\n", pCmd->paArgDescs[i].cTimesMin, pCmd->paArgDescs[i].cTimesMax);
return rc;
static DECLCALLBACK(int) dbgcCmdHelp(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
if (!cArgs)
if (g_pExtCmdsHead)
unsigned iPrecedence = 0;
while (cLeft > 0)
for (i = 0; i < g_cOps; i++)
cLeft--;
iPrecedence++;
bool fFound = false;
fFound = true;
fFound = true;
if ( !fFound
fFound = true;
for (i = 0; i < g_cOps; i++)
fFound = true;
if (!fFound)
return rc;
static DECLCALLBACK(int) dbgcCmdQuit(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
return VERR_DBGC_QUIT;
static DECLCALLBACK(int) dbgcCmdStop(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
int rc;
return rc;
static DECLCALLBACK(int) dbgcCmdEcho(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
int rc = 0;
for (unsigned i = 0; i < cArgs; i++)
return rc;
static DECLCALLBACK(int) dbgcCmdRunScript(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
if (!pFile)
int rc = 0;
unsigned iLine = 0;
iLine++;
rc = pCmdHlp->pfnPrintf(pCmdHlp, NULL, "runscript error: Line #%u is too long (exec overflowed)\n", iLine);
rc = pCmdHlp->pfnPrintf(pCmdHlp, NULL, "runscript error: VWRN_DBGC_CMD_PENDING on line #%u, script terminated\n", iLine);
return rc;
static DECLCALLBACK(int) dbgcCmdDetect(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
if (cArgs != 0)
return rc;
static DECLCALLBACK(int) dbgcCmdCpu(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
if ( cArgs != 0
if (!pVM)
int rc;
if (!cArgs)
return rc;
static DECLCALLBACK(int) dbgcCmdInfo(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
return pCmdHlp->pfnPrintf(pCmdHlp, NULL, "internal error: The parser doesn't do its job properly yet.. quote the string.\n");
if (!pVM)
static DECLCALLBACK(int) dbgcCmdLog(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
return VINF_SUCCESS;
return pCmdHlp->pfnVBoxError(pCmdHlp, rc, "DBGFR3LogModifyGroups(%p,'%s')\n", pVM, paArgs[0].u.pszString);
static DECLCALLBACK(int) dbgcCmdLogDest(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
return VINF_SUCCESS;
return pCmdHlp->pfnVBoxError(pCmdHlp, rc, "DBGFR3LogModifyDestinations(%p,'%s')\n", pVM, paArgs[0].u.pszString);
static DECLCALLBACK(int) dbgcCmdLogFlags(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
return VINF_SUCCESS;
return pCmdHlp->pfnVBoxError(pCmdHlp, rc, "DBGFR3LogModifyFlags(%p,'%s')\n", pVM, paArgs[0].u.pszString);
static DECLCALLBACK(int) dbgcCmdFormat(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
static const char *apszRangeDesc[] =
int rc;
case DBGCVAR_TYPE_UNKNOWN:
case DBGCVAR_TYPE_GC_FLAT:
case DBGCVAR_TYPE_GC_FAR:
case DBGCVAR_TYPE_GC_PHYS:
case DBGCVAR_TYPE_HC_FLAT:
case DBGCVAR_TYPE_HC_PHYS:
case DBGCVAR_TYPE_STRING:
case DBGCVAR_TYPE_NUMBER:
static DECLCALLBACK(int) dbgcCmdLoadImage(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
rc = DBGFR3AsLoadImage(pVM, pDbgc->hDbgAs, pszFilename, pszModName, &ModAddress, NIL_RTDBGSEGIDX, 0 /*fFlags*/);
return VINF_SUCCESS;
static DECLCALLBACK(int) dbgcCmdLoadMap(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
return pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Segment index out of range: %Dv; range={0..%#x}\n", &paArgs[1], RTDBGSEGIDX_LAST);
rc = DBGFR3AsLoadMap(pVM, pDbgc->hDbgAs, pszFilename, pszModName, &ModAddress, NIL_RTDBGSEGIDX, uSubtrahend, 0 /*fFlags*/);
return VINF_SUCCESS;
static DECLCALLBACK(int) dbgcCmdLoadSeg(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
return pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Segment index out of range: %Dv; range={0..%#x}\n", &paArgs[1], RTDBGSEGIDX_LAST);
rc = DBGFR3AsLoadImage(pVM, pDbgc->hDbgAs, pszFilename, pszModName, &ModAddress, iModSeg, 0 /*fFlags*/);
return VINF_SUCCESS;
static DECLCALLBACK(int) dbgcCmdLoadSyms(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
unsigned cbModule = 0;
iArg++;
iArg++;
iArg++;
iArg++;
return VINF_SUCCESS;
static DECLCALLBACK(int) dbgcCmdSet(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
AssertMsg(paArgs[0].enmType == DBGCVAR_TYPE_STRING, ("expected string not %d as first arg!\n", paArgs[0].enmType));
"syntax error: Invalid variable name '%s'. Variable names must match regex '[_a-zA-Z][_a-zA-Z0-9*'!", paArgs[0].u.pszString);
*pszVar++;
if (*pszVar)
"syntax error: Invalid variable name '%s'. Variable names must match regex '[_a-zA-Z][_a-zA-Z0-9*]'!", paArgs[0].u.pszString);
if (!pv)
return VERR_DBGC_PARSE_NO_MEMORY;
pVar->Var.u.pszString = (char *)memcpy(&pVar->szName[paArgs[0].u64Range + 1], paArgs[1].u.pszString, (size_t)paArgs[1].u64Range + 1);
pVar->Var.u.pszString = (char *)memcpy(&pVar->szName[paArgs[0].u64Range + 1], paArgs[1].u.pszString, (size_t)paArgs[1].u64Range + 1);
if (!pv)
return VERR_DBGC_PARSE_NO_MEMORY;
static DECLCALLBACK(int) dbgcCmdUnset(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
for (unsigned i = 0; i < cArgs; i++)
static DECLCALLBACK(int) dbgcCmdLoadVars(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
if (pFile)
psz++;
static DECLCALLBACK(int) dbgcCmdShowVars(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
if (!rc)
if (rc)
return rc;
return VERR_INVALID_NAME;
if (!*pszName)
return VERR_INVALID_NAME;
int ch;
|| cchName == 0))
return VERR_INVALID_NAME;
cchName++;
return VERR_OUT_OF_RANGE;
return VERR_INVALID_NAME;
return VINF_SUCCESS;
while (pCur)
if (ppPrev)
return pCur;
return NULL;
return VINF_SUCCESS;
return rc;
static DECLCALLBACK(int) dbgcPlugInLoadCallback(const char *pchPath, size_t cchPath, void *pvUser1, void *pvUser2)
return VINF_SUCCESS;
return VINF_SUCCESS;
return VERR_TRY_AGAIN;
if (!pPlugIn)
return pCmd
int rc;
rc = RTPathTraverseList(PathVar.u.pszString, ';', dbgcPlugInLoadCallback, (void *)pszPlugIn, pPlugIn);
return pCmd
: rc;
return pCmd
? DBGCCmdHlpFail(pCmdHlp, pCmd, "initialization of plug-in '%s' failed with rc=%Rrc\n", pszPlugIn, rc)
: rc;
return VINF_SUCCESS;
static DECLCALLBACK(int) dbgcCmdLoadPlugIn(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
for (unsigned i = 0; i < cArgs; i++)
if (pPlugIn)
return rc;
return VINF_SUCCESS;
static DECLCALLBACK(int) dbgcCmdUnloadPlugIn(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
for (unsigned i = 0; i < cArgs; i++)
if (!pPlugIn)
if (pPrevPlugIn)
return VINF_SUCCESS;
static DECLCALLBACK(int) dbgcCmdShowPlugIns(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
if (!pPlugIn)
if (!pPlugIn)
static DECLCALLBACK(int) dbgcCmdHarakiri(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
static DECLCALLBACK(int) dbgcCmdWriteCore(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs)
if (!pszDumpPath)
return VINF_SUCCESS;