Ejemplo n.º 1
0
void CmdVariable::help(DebuggerClient &client) {
  client.helpTitle("Variable Command");
  client.helpCmds(
    "[v]ariable",           "lists all local variables on stack",
    "[v]ariable {text}",    "full-text search local variables",
    nullptr
  );
  client.helpBody(
    "This will print names and values of all variables that are currently "
    "accessible by simple names. Use '[w]here', '[u]p {num}', '[d]own {num}', "
    "'[f]rame {index}' commands to choose a different frame to view variables "
    "at different level of the stack.\n"
    "\n"
    "Specify some free text to print local variables that contain the text "
    "either in their names or values. The search is case-insensitive and "
    "string-based."
  );
}
Ejemplo n.º 2
0
void CmdInternalTesting::help(DebuggerClient &client) {
  TRACE(2, "CmdInternalTesting::help\n");
  client.helpTitle("Internal Testing Command");
  client.helpCmds(
    "badcmdtypesend", "Send a bad command type to the proxy",
    "badcmdtypereceive", "Receive a bad command type from the proxy",
    "shortcmdsend", "Send less data that the proxy expects",
    "shortcmdreceive", "Receive less data than the client expects",
    "segfaultClient", "Segfault on the client",
    "segfaultServer", "Segfault on the server",
    nullptr
  );
  client.helpBody(
    "This command is only for internal testing of the debugger, both client "
    "and server. If you're using this command and you're not trying to test "
    "the debugger, then you're making a really big mistake."
  );
}
Ejemplo n.º 3
0
void CmdConfig::help(DebuggerClient &client) {
  client.helpTitle("Set Command");
  client.helpCmds(
    "set bac on/off","on makes debugger bypass access checks on class members",
    "set lf path/off","turn logging on and specify log file",
    "set pl level","if level > 0, only print out object trees to that depth",
    "set cc count","display at most count characters when doing = command",
    "set ss on/off",
      "on makes the debugger take small steps (not entire lines)",
    "set sa on/off","on makes where command display argument values",
    "set mcl limit","display at most limit source lines at breakpoints",
    nullptr);
  client.helpBody(
    "Use this command to change default settings. "
    "The new values are persisted into "
    "the configuration file that normally can be found at ~/.hphpd.ini. "
    "Level, count and limit can be <= 0, in which case they are unlimited."
  );
}
Ejemplo n.º 4
0
void CmdWhere::help(DebuggerClient &client) {
  client.helpTitle("Where Command");
  client.helpCmds(
    "[w]here", "displays current stacktrace",
    "[w]here [a]sync", "displays the current async stacktrace",
    "wa", "shortcut for [w]here [a]sync",
    "[w]here {[a]sync]} {num}", "displays number of innermost frames",
    "[w]here {[a]sync]} -{num}", "displays number of outermost frames",
    nullptr
  );
  client.helpBody(
    "Use '[u]p {num}' or '[d]own {num}' to walk up or down the stacktrace. "
    "Use '[f]rame {index}' to jump to one particular frame. At any frame, "
    "Use '[v]ariable' command to display all local variables.\n"
    "\n"
    "Use '[w]here [a]sync' from within an async method, like a generator, "
    "to get the current stack of async methods."
  );
}
Ejemplo n.º 5
0
void CmdHelp::help(DebuggerClient &client) {
  client.helpTitle("Help Command");
  client.helpCmds(
    "[h]elp [s]tart", "displays material for getting started",
    "[h]elp [t]utorial on|off|auto", "changing tutorial modes",
    nullptr
  );
  client.helpBody(
    "Please read \"Getting Started\" material with '[h]elp [s]tart' for "
    "first time use to get yourself familiar with basics.\n"
    "\n"
    "Tutorial mode displays extra information when something didn't work "
    "as you expected. \"auto\" mode will display the same information just "
    "once. \"on\" mode will display it as long as you run into the same "
    "situation. \"off\" mode completely turns off all tutorial texts.\n"
    "\n"
    "To get detailed information of a command, type '{cmd} [h]elp' or '{cmd} "
    "?' or 'help {cmd}' or '? {cmd}'."
  );
}
Ejemplo n.º 6
0
void CmdThread::help(DebuggerClient &client) {
  client.helpTitle("Thread Command");
  client.helpCmds(
    "[t]hread",                 "displays current thread's information",
    "[t]hread [l]ist",          "lists all threads at break",
    "[t]hread {index}",         "switches to the specified thread",
    "[t]hread [n]ormal",        "breaks all threads",
    "[t]hread [s]ticky",        "only send command to current thread",
    "[t]hread [e]xclusive",     "only break current thread",
    nullptr
  );
  client.helpBody(
    "Use '[t]hread' alone to display information of current thread.\n"
    "\n"
    "When a thread is at break, you may specify how other threads should "
    "behave if they also happen to hit some breakpoints. Normally, other "
    "threads will also break, and they will interrupt debugger session "
    "with their breakpoints. So breaks from different threads may interleave. "
    "If '[t]hread [s]ticky' is specified, all other threads will wait until "
    "current thread is finished. This will help debugging to focus on just "
    "one thread without losing breaks from other threads. If there is no need "
    "to hold up any other threads, use '[t]hread [e]xclusive'. Then other "
    "threads will not break at all. This mode is useful for live debugging "
    "a production server, without interrupting many threads at a time. Use "
    "'[t]hread [n]ormal' to change thread mode back to normal.\n"
    "\n"
    "Some debugging commands will automatically turn thread mode to sticky. "
    "These include continue, step, next or out commands with a counter of "
    "more than 1. These commands imply non-interruption from another thread. "
    "The mode will remain even after these commands until '[t]hread [n]ormal' "
    "is issued."
    "\n"
    "When multple threads hit breakpoints at the same time, use '[t]hread "
    "[l]ist' command to display their indices, which can be used to switch "
    "between them with '[t]hread {index}'."
  );
}
Ejemplo n.º 7
0
void CmdMacro::help(DebuggerClient &client) {
  client.helpTitle("Macro Command");
  client.helpCmds(
    "& [s]tart",            "starts recording of default macro",
    "& [s]tart {name}",     "starts recording of a named macro",
    "& [e]nd",              "stops and saves recorded macro",
    "& [r]eplay",           "replays default macro",
    "& [r]eplay {name}",    "replays a named macro",
    "& [l]ist",             "lists all macros",
    "& [c]lear {index}",    "deletes a macro",
    nullptr
  );
  client.helpBody(
    "Macro command allows you to record a series of debugger command, so "
    "you can replay later by its name. When name is not specified, it will "
    "use \"default\" as the name.\n"
    "\n"
    "There is also a special macro \"startup\" that will be replayed "
    "every time when debugger is just started. Use startup macro to load "
    "certain PHP files or perform certain debugging environment setup.\n"
    "\n"
    "The space between & and command is not needed. '&s' works as well."
  );
}
Ejemplo n.º 8
0
void CmdHelp::HelpStarted(DebuggerClient &client) {
  client.helpTitle("Getting Started with Debugger");

  client.helpBody(
    "1. Quick Overview\n"
    "\n"
    "(1) from A to Z\n"
    "\n"
    "All built-in debugger commands are un-ambiguous with their first "
    "letters. Therefore, a single letter is sufficient to issue the "
    "command.\n"
    "\n"
    "(2) tab, tab, tab\n"
    "\n"
    "Use TAB to auto-complete.\n"
    "\n"
    "(3) input PHP code\n"
    "\n"
    "For single line of PHP code, use \"=\" to print an expression's value, "
    "OR, use \"@\" to execute an expression or statement without printing "
    "return values, OR, start an assignment with \"$\" variable name.\n\n"
    "For multi-line PHP code, type \"<\" then TAB. Now you can type or paste "
    "multiple lines of code. Hit return to start a new line, then TAB. That "
    "will auto-complete \"?>\" to finish the block. Hit return to execute.\n"
    "\n"
    "(4) help\n"
    "\n"
    "Use \"help\" to read more about command details.\n"
    "\n"
    "(5) info and list\n"
    "\n"
    "Use \"info\" and \"list\" commands to read more about source code.\n"
    "\n"
    "(6) readline\n"
    "\n"
    "Debugger is written with readline library, which has rich feature set, "
    "including switching between emacs and vi editing mode. Please read its "
    "[[ http://cnswww.cns.cwru.edu/php/chet/readline/readline.html#SEC1 | "
    "documentation]] for more details."
  );

  client.helpBody(
    "2. Debugging local script\n"
    "\n"
    "The command to run a script normally looks like this,\n"
    "\n"
    "  hhvm myscript.php\n"
    "\n"
    "Simply add \"-m debug\" to run the script in debugger,\n\n"
    "\n"
    "  hhvm -m debug myscript.php\n"
    "\n"
    "Once started, set breakpoints like this,\n"
    "\n"
    "  hphpd> break myscript.php:10\n"
    "  hphpd> break foo()\n"
    "\n"
    "Then let it run, until it hits the breakpoints,\n"
    "\n"
    "  hphpd> run\n"
    "\n"
    "The debugger will highlight current statement or expression that is "
    "just about to evaluate. Sometimes a statement is highlighted first, then "
    "sub-expressions inside the statement are highlighted one after another "
    "while repeating step commands.\n"
    "\n"
    "At any breakpoints, examine variables or evaluate expressions,\n"
    "\n"
    "  hphpd> variable\n"
    "  hphpd> print $a\n"
    "  hphpd> =$a\n"
    "  hphpd> <?php print $a; ?>\n"
    "  hphpd> <?php\n"
    "   ..... print $a;\n"
    "   ..... ?>\n"
    "\n"
    "Optionally, modify variables like this,\n"
    "\n"
    "  hphpd> $a = 10\n"
    "  hphpd> <?php $a = 10; ?>\n"
    "  hphpd> <?php\n"
    "   ..... $a = 10;\n"
    "   ..... ?>\n"
    "\n"
    "Then let it continue, until it hits more breakpoints,\n"
    "\n"
    "  hphpd> continue\n"
    "\n"
    "Finally, quit debugger,\n"
    "\n"
    "  hphpd> quit"
  );

  client.helpBody(
    "3. Debugging sandbox\n"
    "\n"
    "Connect to an HHVM server from command line,\n"
    "\n"
    "  hhvm -m debug -h mymachine.com\n"
    "\n"
    "Or, connect from within debugger,\n"
    "\n"
    "  hphpd> machine connect mymachine.com\n"
    "\n"
    "This will try to attach to a default sandbox on that machine. "
    "\"Attaching\" means it will only debug web requests hitting that "
    "sandbox. To switch to a different sandbox,\n"
    "\n"
    "  mymachine> machine list\n"
    "  mymachine> machine attach 2\n"
    "\n"
    "In remote debugging mode, a breakpoint can be specific about an URL,\n"
    "\n"
    "  mymachine> break myscript.php:[email protected]\n"
    "  mymachine> break foo()@index.php\n"
    "\n"
    "You may connect to more than one machine and breakpoints will be "
    "shared by all of them."
  );

  client.helpBody(
    "4. Understanding dummy sandbox\n"
    "\n"
    "When a web request hits a breakpoint, debugger will run in a "
    "\"Web Request\" thread. Use \"thread\" command to display this "
    "information,\n"
    "\n"
    "  mymachine> thread\n"
    "\n"
    "What will debugger use when there is no web request thread that's "
    "active, but we need to set a breakpoint? We created so-called "
    "\"dummy sandbox\", purely for taking debugger commands when there is "
    "no active web request. When there is no active request, hit Ctrl-C to "
    "break debugger, and use \"thread\" to display dummy sandbox thread's "
    "information.\n"
    "\n"
    "  Ctrl-C\n"
    "  mymachine> thread\n"
    "\n"
    "In dummy sandbox, a PHP file can be pre-loaded, so that we can "
    "\"info\" functions and classes and execute certain code. This file is "
    "specified on server side by\n"
    "\n"
    "  Eval.Debugger.StartupDocument = scripts/startup.php\n"
    "\n"
    "Dummy sandbox will always use currently attached sandbox's PHP files. "
    "When files are modified, simply reload them by\n"
    "\n"
    "  mymachine> continue\n"
    "  Ctrl-C"
  );

  client.helpBody(
    "5. Colors and Configuration\n"
    "\n"
    "By default, it will use emacs colors for dark background. To change "
    "them, run debugger at least once, then look for ~/.hphpd.hdf file. "
    "Replace \"Code\" node with,\n"
    "\n"
    "  Color {\n"
    "    Code : Color.Palette.vim\n"
    "  }\n"
    "\n"
    "Or, specify your own colors in different places of the configuration "
    "file."
  );
}