gdb调试技巧(不断更新)

指定段地址,用于加载地址和运行地址不同的情况
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风格汇编代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值