GDB / LLDB

打印变量

  • 变量打印

    (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>命令,这样可以直接运行到指定行,从而跳出函数或循环

文档信息

Search

    Table of Contents