打印变量
-
变量打印
(gdb) p/x val
-
查看寄存器值
lldb:
re r x20
或者以格式化方式打印:
re r -f float x0
-
查看内存状态
lldb:
memory region <address>
-
打印内存值
(gdb) x/nuf <address>
n
表示要打印的内存单元数u
表示内存单元大小:- `b`表示单字节 - `h`表示双字节 - `w`表示四字节 - `g`表示八字节
f
表示打印的格式,通常选择x
表示 16 进制
设置断点
b func_name
b file_name:line_number
b *address
- 条件断点
(lldb) br s -f quickjs.cc -l 31991 -c '((int)strcmp(s->filename, "out/Default/primjs_test/test262/test/language/expressions/compound-assignment/S11.13.2_A7.1_T1.js")==0)'
修改变量
(gdb) print x=<num>
单步调试
通常情况下,step 命令和 next 命令的功能相同,都是单步执行程序。不同之处在于,当 step 命令所执行的代码行中包含函数时,会进入该函数内部,并在函数第一行代码处停止执行。
查看汇编,并单步:
- gdb
display /10i $pc si/ni
- lldb
(lldb) target stop-hook add Enter your stop hook command(s). Type 'DONE' to end. bt disassemble --pc 或者 x/10i $pc DONE Stop hook #1 added.
处理信号
在调试 JVM 时,由于 JVM 对某些信号会做处理,所以不能让 GDB 先处理,需要屏蔽:
- gdb
handle SIGSEGV pass nostop noprint handle SIGILL pass nostop noprint
- lldb
pro hand -p true -s false <SIGQUIT>
调试 coredump
gdb path/to/the/executable path/to/the/coredump
退出当前函数
-
第一种用
finish
命令,这样函数会继续执行完,并且打印返回值,然后等待输入接下来的命令。 -
第二种用
return
命令,这样函数不会继续执行下面的语句,而是直接返回。也可以用return expression
命令指定函数的返回值。 -
第三种用
until <lineno>
命令,这样可以直接运行到指定行,从而跳出函数或循环
文档信息
- 本文作者:Zhuojun Miao
- 本文链接:https://miaozhuojun.github.io/wiki/gdb/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)