1.REPL
1.1 交互式环境-REPL:
REPL
是Read-Eval-Print-Loop
(读取-执行-输出-循环)的首字母缩写。它是一个命令行工具
,可以快速尝试Swift
代码。
1.2 特征
它读取指令、执行指令、输出结果,再重新开始。
1.3 优点
它能够直接运行代码,而不用创建包含调试语句的源代码文件,再编译、运行并查看结果。
注:这种
交互性
是Swift
有别于C
和Objective-C
等众多编译型语言的特点之一。
2. 如何使用REPL
?
2.1 命令行
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer/
系统将提示你输入管理员密码。按要求输入即可。必须执行这个命令,它是用来确保Xcode
是Mac
计算机运行的Xcode
默认版本,以防止你安装的是以前的Xcode
版本。只需要执行一次这个命令。它指定的设置将被保存,除非你要切换到其他Xcode版本
,否则不用再执行这个命令。
2.2 xcrun swift
输入下面的命令并按回车以进入Swift REPL
: 如果出现要求你输入密码的对话框,输入密码即可。进入Swift REPL
,你将会看到以下问候消息:
xcrun swift
Welcome to Apple Swift version 5.3.2 (swiftlang-1200.0.45 clang-1200.0.32.28).
Type :help for assistance.
1> print("i love you baby")
i love you baby
2>
2.3 帮助和退出:
Swift
内置了REPL
命令帮助信息。在提示符下输入:help
可列出REPL命令清单,这些命令开头都有一个冒号,Swift
使用它来区分REPL命令和Swift语句。
1> :help
The REPL (Read-Eval-Print-Loop) acts like an interpreter. Valid
statements, expressions, and declarations are immediately compiled and
executed.
The complete set of LLDB debugging commands are also available as
described below. Commands must be prefixed with a colon at the REPL
prompt (:quit for example.) Typing just a colon followed by return will
switch to the LLDB prompt.
Debugger commands:
apropos -- List debugger commands related to a word or
subject.
breakpoint -- Commands for operating on breakpoints (see 'help
b' for shorthand.)
command -- Commands for managing custom LLDB commands.
disassemble -- Disassemble specified instructions in the current
target. Defaults to the current function for the
current thread and stack frame.
expression -- Evaluate an expression on the current thread.
Displays any returned value with LLDB's default
formatting.
frame -- Commands for selecting and examing the current
thread's stack frames.
gdb-remote -- Connect to a process via remote GDB server. If
no host is specifed, localhost is assumed.
gui -- Switch into the curses based GUI mode.
help -- Show a list of all debugger commands, or give
details about a specific command.
kdp-remote -- Connect to a process via remote KDP server. If
no UDP port is specified, port 41139 is assumed.
language -- Commands specific to a source language.
log -- Commands controlling LLDB internal logging.
memory -- Commands for operating on memory in the current
target process.
platform -- Commands to manage and create platforms.
plugin -- Commands for managing LLDB plugins.
process -- Commands for interacting with processes on the
current platform.
quit -- Quit the LLDB debugger.
register -- Commands to access registers for the current
thread and stack frame.
reproducer -- Commands for manipulating reproducers.
Reproducers make it possible to capture full
debug sessions with all its dependencies. The
resulting reproducer is used to replay the debug
session while debugging the debugger.
Because reproducers need the whole the debug
session from beginning to end, you need to launch
the debugger in capture or replay mode, commonly
though the command line driver.
Reproducers are unrelated record-replay
debugging, as you cannot interact with the
debugger during replay.
script -- Invoke the script interpreter with provided code
and display any results. Start the interactive
interpreter if no code is supplied.
settings -- Commands for managing LLDB settings.
source -- Commands for examining source code described by
debug information for the current target process.
statistics -- Print statistics about a debugging session
target -- Commands for operating on debugger targets.
thread -- Commands for operating on one or more threads in
the current process.
type -- Commands for operating on the type system.
version -- Show the LLDB debugger version.
watchpoint -- Commands for operating on watchpoints.
Current command abbreviations (type ':help command alias' for more info):
add-dsym -- Add a debug symbol file to one of the target's current
modules by specifying a path to a debug symbols file, or
using the options to specify a module to download symbols
for.
attach -- Attach to process by ID or name.
b -- Set a breakpoint using one of several shorthand formats.
bt -- Show the current thread's call stack. Any numeric
argument displays at most that many frames. The argument
'all' displays all threads.
c -- Continue execution of all threads in the current process.
call -- Evaluate an expression on the current thread. Displays
any returned value with LLDB's default formatting.
continue -- Continue execution of all threads in the current process.
detach -- Detach from the current target process.
di -- Disassemble specified instructions in the current target.
Defaults to the current function for the current thread
and stack frame.
dis -- Disassemble specified instructions in the current target.
Defaults to the current function for the current thread
and stack frame.
display -- Evaluate an expression at every stop (see 'help target
stop-hook'.)
down -- Select a newer stack frame. Defaults to moving one
frame, a numeric argument can specify an arbitrary number.
env -- Shorthand for viewing and setting environment variables.
exit -- Quit the LLDB debugger.
f -- Select the current stack frame by index from within the
current thread (see 'thread backtrace'.)
file -- Create a target using the argument as the main executable.
finish -- Finish executing the current stack frame and stop after
returning. Defaults to current thread unless specified.
image -- Commands for accessing information for one or more target
modules.
j -- Set the program counter to a new address.
jump -- Set the program counter to a new address.
kill -- Terminate the current target process.
l -- List relevant source code using one of several shorthand
formats.
list -- List relevant source code using one of several shorthand
formats.
n -- Source level single step, stepping over calls. Defaults
to current thread unless specified.
next -- Source level single step, stepping over calls. Defaults
to current thread unless specified.
nexti -- Instruction level single step, stepping over calls.
Defaults to current thread unless specified.
ni -- Instruction level single step, stepping over calls.
Defaults to current thread unless specified.
p -- Evaluate an expression on the current thread. Displays
any returned value with LLDB's default formatting.
parray -- parray <COUNT> <EXPRESSION> -- lldb will evaluate
EXPRESSION to get a typed-pointer-to-an-array in memory,
and will display COUNT elements of that type from the
array.
po -- Evaluate an expression on the current thread. Displays
any returned value with formatting controlled by the
type's author.
poarray -- poarray <COUNT> <EXPRESSION> -- lldb will evaluate
EXPRESSION to get the address of an array of COUNT
objects in memory, and will call po on them.
print -- Evaluate an expression on the current thread. Displays
any returned value with LLDB's default formatting.
q -- Quit the LLDB debugger.
r -- Launch the executable in the debugger.
rbreak -- Sets a breakpoint or set of breakpoints in the executable.
re -- Commands to access registers for the current thread and
stack frame.
repl -- Evaluate an expression on the current thread. Displays
any returned value with LLDB's default formatting.
run -- Launch the executable in the debugger.
s -- Source level single step, stepping into calls. Defaults
to current thread unless specified.
shell -- Run a shell command on the host.
si -- Instruction level single step, stepping into calls.
Defaults to current thread unless specified.
sif -- Step through the current block, stopping if you step
directly into a function whose name matches the
TargetFunctionName.
step -- Source level single step, stepping into calls. Defaults
to current thread unless specified.
stepi -- Instruction level single step, stepping into calls.
Defaults to current thread unless specified.
t -- Change the currently selected thread.
tbreak -- Set a one-shot breakpoint using one of several shorthand
formats.
undisplay -- Stop displaying expression at every stop (specified by
stop-hook index.)
up -- Select an older stack frame. Defaults to moving one
frame, a numeric argument can specify an arbitrary number.
v -- Show variables for the current stack frame. Defaults to
all arguments and local variables in scope. Names of
argument, local, file static and file global variables
can be specified. Children of aggregate variables can be
specified such as 'var->child.x'. The -> and []
operators in 'frame variable' do not invoke operator
overloads if they exist, but directly access the
specified element. If you want to trigger operator
overloads use the expression command to print the
variable instead.
It is worth noting that except for overloaded operators,
when printing local variables 'expr local_var' and 'frame
var local_var' produce the same results. However, 'frame
variable' is more efficient, since it uses debug
information and memory reads directly, rather than
parsing and evaluating an expression, which may even
involve JITing and running code in the target program.
var -- Show variables for the current stack frame. Defaults to
all arguments and local variables in scope. Names of
argument, local, file static and file global variables
can be specified. Children of aggregate variables can be
specified such as 'var->child.x'. The -> and []
operators in 'frame variable' do not invoke operator
overloads if they exist, but directly access the
specified element. If you want to trigger operator
overloads use the expression command to print the
variable instead.
It is worth noting that except for overloaded operators,
when printing local variables 'expr local_var' and 'frame
var local_var' produce the same results. However, 'frame
variable' is more efficient, since it uses debug
information and memory reads directly, rather than
parsing and evaluating an expression, which may even
involve JITing and running code in the target program.
vo -- Show variables for the current stack frame. Defaults to
all arguments and local variables in scope. Names of
argument, local, file static and file global variables
can be specified. Children of aggregate variables can be
specified such as 'var->child.x'. The -> and []
operators in 'frame variable' do not invoke operator
overloads if they exist, but directly access the
specified element. If you want to trigger operator
overloads use the expression command to print the
variable instead.
It is worth noting that except for overloaded operators,
when printing local variables 'expr local_var' and 'frame
var local_var' produce the same results. However, 'frame
variable' is more efficient, since it uses debug
information and memory reads directly, rather than
parsing and evaluating an expression, which may even
involve JITing and running code in the target program.
x -- Read from the memory of the current target process.
For more information on any command, type ':help <command-name>'.
退出Swift
,可以执行命令:quit
1> :quit
➜ ~
网友评论