在调试器内跳转
设置断点和启动进程
- gdb
- lldb
% gdb a.out
(gdb) br main
(gdb) run
% lldb a.out
(lldb) br main
(lldb) run
单步调试
step-in 单步调试 (源码级别)
- gdb
- lldb
(gdb) step
(gdb) s
(lldb) thread step-in
(lldb) step
(lldb) s
step-over 单步调试 (源码级别)
- gdb
- lldb
(gdb) next
(gdb) n
(lldb) thread step-over
(lldb) next
(lldb) n
step-in 单步调试 (汇编指令级别)
- gdb
- lldb
(gdb) stepi
(gdb) si
(lldb) thread step-inst
(lldb) si
step-over 单步调试 (汇编指令级别)
- gdb
- lldb
(gdb) nexti
(gdb) ni
(lldb) thread step-inst-over
(lldb) ni
step-over 跳出栈帧
- gdb
- lldb
(gdb) finish
(lldb) thread step-out
(lldb) finish
断点调试
跳转到下一个断点
- gdb
- lldb
(gdb) continue
(gdb) c
(lldb) continue
(lldb) c
运行到指定行数
- gdb
- lldb
(gdb) until 12
(lldb) thread until 12
线程切换
列出程序中的线程
- gdb
- lldb
(gdb) info threads
(lldb) thread list
设置后续命令的默认线程
- gdb
- lldb
(gdb) thread 1
(lldb) thread select 1
(lldb) t 1
栈帧切换
显示当前栈帧简略信息
- gdb
- lldb
(gdb) info frame
(gdb) i f
(lldb) frame info
(lldb) fr i
显示当前栈帧源代码行
- gdb
- lldb
# check frame source code
(gdb) frame
(lldb) frame select
(lldb) f
(lldb) process status
通过栈帧号选择栈帧
- gdb
- lldb
(gdb) frame 12
(lldb) frame select 12
(lldb) fr s 12
(lldb) f 12
选择调用当前栈帧的栈帧
- gdb
- lldb
(gdb) up
(lldb) up
(lldb) frame select --relative=1
(lldb) fr s -r 1
选择被当前栈帧调用的栈帧
- gdb
- lldb
(gdb) down
(lldb) down
(lldb) frame select --relative=-1
(lldb) fr s -r -1
使用栈帧相对偏移选择栈帧
- gdb
- lldb
(gdb) up 2
(gdb) down 3
(lldb) frame select --relative 2
(lldb) fr s -r 2
(lldb) frame select --relative -3
(lldb) fr s -r -3
从栈帧返回,可以带有返回值
- gdb
- lldb
(gdb) return <RETURN EXPRESSION>
(lldb) thread return <RETURN EXPRESSION>
调用带有断点的函数并在断点处停止
- gdb
- lldb
(gdb) set unwindonsignal 0
(gdb) p function_with_a_breakpoint()
(lldb) expr -i 0 -- function_with_a_breakpoint()
调用 crash 的函数并在 crash 时停止
- gdb
- lldb
(gdb) set unwindonsignal 0
(gdb) p function_which_crashes()
(lldb) expr -u 0 -- function_which_crashes()