指定段地址,用于加载地址和运行地址不同的情况
add-symbol-file xxx.elf 0x80030 -s .text.boot 0x80000 -s .rodata 0x80758
x/10i 0xad07b1af 打印这个地址处的汇编命令
x/10i $pc 打印pc处的汇编指令
p $eax 打印寄存器
修改变量 set v xxx=xxx
set {char}地址=‘x’
set {char*}地址=“xxxxx”
set pagination off 去掉半屏提示
disassemble $pc 查看某个位置的反汇编代码,注意gdb是流水线反汇编器,所以你看到的反汇编代码有可能是错误的
layout split : 在tui模式上增加反汇编和源码窗口
info reg 显示寄存器内容
打印寄存器
p $eax
p $ecx
修改寄存器内容
set $eax=xxx
在地址处下断点
b *xxx
b *$eax
设置断点处只执行命令不停止
在端点xxxx处打印eax寄存器的值不停止在断点处
b xxxx
commands
p $eax
end
显示寄存器地址处的字符串内容
p (char*)
e
a
x
p
(
c
h
a
r
∗
)
eax p (char*)
eaxp(char∗)ebx
修改寄存器地址处的变量
b {char}$eax=‘f’
注意{}把地址解释指向的内存
设置宏打印eax寄存器
define sax
print $eax
end
symbol-file xxx.symbol 加载符号
或者启动的时候 -s xxx.symbol
当一个系统库我们没有安装调试信息的情况下 在ubuntu可以这么安装,以libncursesw为例子
$apt-cache search libncursesw
libncursesw5 - shared libraries for terminal handling (wide character support)
libncursesw5-dbg - debugging/profiling libraries for ncursesw
libncursesw5-dev - developer’s libraries for ncursesw
#dpkg -l | grep libncursesw
# apt-get install -y libncursesw5-dbg
64位汇编
当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。
当参数为7个以上时, 前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。
https://blog.csdn.net/riopho/article/details/80593125
最重要的就是不同版本编译出来的调试格式不一样导致一些gdb不能识别
使用readelf --debug-dump=info
可以dump debug段的信息,
Version: 4代表DWARF4
-gdwarf-2 或者 -gdwarf-3 指定其他版本的文件格式
set scheduler-locking [on/off/step]
下面根据实际测试结果对scheduler-locking的3种取值进行说明:
on:只有当前调试线程运行,其他线程处于暂停状态。
off:当前调试线程外的其他线程一直在正常运行。
step:其他线程跟随当前调试线程运行,但具体怎么协同运行,测试中无法体现。
信号处理
handle SIG33 nostop noprint pass
单步调试汇编代码
disas 命令执行反汇编,然后就可以执行追踪了
设置汇编语法
set disassembly-flavor intel 切换为intel风格汇编代码