168 lines
6.2 KiB
Python
Raw Normal View History

"""
Test some lldb command abbreviations.
"""
import os, time
import unittest2
import lldb
from lldbtest import *
class AbbreviationsTestCase(TestBase):
mydir = os.path.join("functionalities", "abbreviation")
def test_nonrunning_command_abbreviations (self):
self.expect("ap script",
startstr = "The following commands may relate to 'script':",
substrs = ['breakpoint command add',
'breakpoint command list',
'breakpoint list',
'command alias',
'expression',
'script'])
self.runCmd("com a alias com al")
self.runCmd("alias gurp help")
Centralized a lot of the status information for processes, threads, and stack frame down in the lldb_private::Process, lldb_private::Thread, lldb_private::StackFrameList and the lldb_private::StackFrame classes. We had some command line commands that had duplicate versions of the process status output ("thread list" and "process status" for example). Removed the "file" command and placed it where it should have been: "target create". Made an alias for "file" to "target create" so we stay compatible with GDB commands. We can now have multple usable targets in lldb at the same time. This is nice for comparing two runs of a program or debugging more than one binary at the same time. The new command is "target select <target-idx>" and also to see a list of the current targets you can use the new "target list" command. The flow in a debug session can be: (lldb) target create /path/to/exe/a.out (lldb) breakpoint set --name main (lldb) run ... hit breakpoint (lldb) target create /bin/ls (lldb) run /tmp Process 36001 exited with status = 0 (0x00000000) (lldb) target list Current targets: target #0: /tmp/args/a.out ( arch=x86_64-apple-darwin, platform=localhost, pid=35999, state=stopped ) * target #1: /bin/ls ( arch=x86_64-apple-darwin, platform=localhost, pid=36001, state=exited ) (lldb) target select 0 Current targets: * target #0: /tmp/args/a.out ( arch=x86_64-apple-darwin, platform=localhost, pid=35999, state=stopped ) target #1: /bin/ls ( arch=x86_64-apple-darwin, platform=localhost, pid=36001, state=exited ) (lldb) bt * thread #1: tid = 0x2d03, 0x0000000100000b9a a.out`main + 42 at main.c:16, stop reason = breakpoint 1.1 frame #0: 0x0000000100000b9a a.out`main + 42 at main.c:16 frame #1: 0x0000000100000b64 a.out`start + 52 Above we created a target for "a.out" and ran and hit a breakpoint at "main". Then we created a new target for /bin/ls and ran it. Then we listed the targest and selected our original "a.out" program, so we showed two concurent debug sessions going on at the same time. llvm-svn: 129695
2011-04-18 08:33:37 +00:00
self.expect("gurp target create",
substrs = ['Syntax: target create <cmd-options> <filename>'])
self.runCmd("com u gurp")
self.expect("gurp",
COMMAND_FAILED_AS_EXPECTED, error = True,
substrs = ["error: 'gurp' is not a valid command."])
self.expect("h",
startstr = "The following is a list of built-in, permanent debugger commands:")
self.expect("com sou ./change_prompt.lldb",
patterns = ["Executing commands in '.*change_prompt.lldb'"])
self.expect("settings show prompt",
startstr = 'prompt (string) = "[old-oak]"')
self.runCmd("settings set -r prompt")
self.expect("settings show prompt",
startstr = 'prompt (string) = "(lldb) "')
self.expect("lo li",
startstr = "Logging categories for ")
self.runCmd("se se prompt Sycamore> ")
self.expect("se sh prompt",
startstr = 'prompt (string) = "Sycamore>"')
self.runCmd("se se -r prompt")
self.expect("set sh prompt",
startstr = 'prompt (string) = "(lldb) "')
# We don't want to display the stdout if not in TraceOn() mode.
if not self.TraceOn():
self.HideStdout()
self.runCmd (r'''sc print "\n\n\tHello!\n"''')
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
def test_with_dsym (self):
self.buildDsym ()
self.running_abbreviations ()
def test_with_dwarf (self):
self.buildDwarf ()
self.running_abbreviations ()
def running_abbreviations (self):
exe = os.path.join (os.getcwd(), "a.out")
self.expect("fil " + exe,
patterns = [ "Current executable set to .*a.out.*" ])
Moved the execution context that was in the Debugger into the CommandInterpreter where it was always being used. Make sure that Modules can track their object file offsets correctly to allow opening of sub object files (like the "__commpage" on darwin). Modified the Platforms to be able to launch processes. The first part of this move is the platform soon will become the entity that launches your program and when it does, it uses a new ProcessLaunchInfo class which encapsulates all process launching settings. This simplifies the internal APIs needed for launching. I want to slowly phase out process launching from the process classes, so for now we can still launch just as we used to, but eventually the platform is the object that should do the launching. Modified the Host::LaunchProcess in the MacOSX Host.mm to correctly be able to launch processes with all of the new eLaunchFlag settings. Modified any code that was manually launching processes to use the Host::LaunchProcess functions. Fixed an issue where lldb_private::Args had implicitly defined copy constructors that could do the wrong thing. This has now been fixed by adding an appropriate copy constructor and assignment operator. Make sure we don't add empty ModuleSP entries to a module list. Fixed the commpage module creation on MacOSX, but we still need to train the MacOSX dynamic loader to not get rid of it when it doesn't have an entry in the all image infos. Abstracted many more calls from in ProcessGDBRemote down into the GDBRemoteCommunicationClient subclass to make the classes cleaner and more efficient. Fixed the default iOS ARM register context to be correct and also added support for targets that don't support the qThreadStopInfo packet by selecting the current thread (only if needed) and then sending a stop reply packet. Debugserver can now start up with a --unix-socket (-u for short) and can then bind to port zero and send the port it bound to to a listening process on the other end. This allows the GDB remote platform to spawn new GDB server instances (debugserver) to allow platform debugging. llvm-svn: 129351
2011-04-12 05:54:46 +00:00
self.expect("_regexp-b product",
substrs = [ "breakpoint set --name 'product'",
"Breakpoint created: 1: name = 'product', locations = 1" ])
self.expect("br s -n sum",
startstr = "Breakpoint created: 2: name = 'sum', locations = 1")
self.expect("br s -f main.cpp -l 32",
startstr = "Breakpoint created: 3: file ='main.cpp', line = 32, locations = 1")
self.runCmd("br co a -s python 1 -o 'print frame'")
self.expect("br co l 1",
substrs = [ "Breakpoint 1:",
"Breakpoint commands:",
"print frame" ])
self.runCmd("br co del 1")
self.expect("breakpoint command list 1",
startstr = "Breakpoint 1 does not have an associated command.")
self.expect("br di",
startstr = 'All breakpoints disabled. (3 breakpoints)')
self.expect("bre e",
startstr = "All breakpoints enabled. (3 breakpoints)")
self.expect("break list",
substrs = ["1: name = 'product', locations = 1",
"2: name = 'sum', locations = 1",
"3: file ='main.cpp', line = 32, locations = 1"])
self.expect("br cl -l 32 -f main.cpp",
startstr = "1 breakpoints cleared:",
substrs = ["3: file ='main.cpp', line = 32, locations = 1"])
# Add a future to terminate the current process being debugged.
#
# The test framework relies on detecting either "run" or "process launch"
# command to automatically kill the inferior upon tear down.
# But we'll be using "pro la" command to launch the inferior.
self.addTearDownHook(lambda: self.runCmd("process kill"))
self.expect("pro la",
patterns = [ "Process .* launched: "])
self.expect("pro st",
patterns = [ "Process .* stopped",
"thread #1:",
"a.out",
"sum\(int, int\)",
"at main.cpp\:25",
"stop reason = breakpoint 2.1" ])
# ARCH, if not specified, defaults to x86_64.
if self.getArchitecture() in ["", 'x86_64', 'i386']:
self.expect("disass -f",
startstr = "a.out`sum(int, int)",
substrs = [' push',
' mov',
' addl ',
'ret'],
patterns = ['(leave|popq|popl)'])
self.expect("i d l main.cpp",
patterns = ["Line table for .*main.cpp in `a.out"])
self.expect("i d se",
patterns = ["Dumping sections for [0-9]+ modules."])
self.expect("i d symf",
patterns = ["Dumping debug symbols for [0-9]+ modules."])
self.expect("i d symt",
patterns = ["Dumping symbol table for [0-9]+ modules."])
self.expect("i li",
substrs = [ 'a.out',
'/usr/lib/dyld',
'/usr/lib/libstdc++',
'/usr/lib/libSystem.B.dylib',
'/usr/lib/system/libmathCommon.A.dylib'])
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
atexit.register(lambda: lldb.SBDebugger.Terminate())
unittest2.main()