gdb

Author Avatar
Aryb1n 5月 10, 2017

好吧,承认我连gdb都不怎么会用,只会r一下,break一下,p一下。。。

发现一份张银奎巨佬的pptgdb基础

Convenience Variables

GDB维护的伪变量, $开头
$ most recent displayed value
$ $n nth displayed value
$ $$ displayed value previous to $
$ $$n nth displayed value back from $

可以使用set命令定义
set $foo = *object_ptr

Gdb variables

(gdb) set $foo = 4
(gdb) p $foo
$3 = 4

Register Variables

(gdb) break write if $rsi == 2

常用命令

break(b): 软件断点
watch: 硬件断点(其实我从来没打过这个)
backtrace(bt): 显示函数调用序列(栈回溯)
continue(c): 恢复执行
next/step(n/s): 单步
x: 观察内存
info locals: 观察局部变量
pt: 观察数据结构
finish: 执行到函数返回
frame: 查看当前栈帧
i shared: 列模块

附加

gdb --pid=<n>

or

attach process-id
detach  => 分离
quit    => 杀死

调用函数

call sum(1, 2)      #call sum and print ret value

查看变量和内存

变量

print [/f] [expr]
    f format:
        x hex
        d signed decimal
        u unsigned decimal
        o octal
        t binary
        a address, absolute and relative
        c character
        f floating point

内存

x [/Nuf] expr
    N count of how many units to display
    u unit size, one of:
        b individual bytes
        h halfwords
        w words
        g giant words
    f printing format, Any `print` format or,
        s null-terminated string(就是一条string啦)
        i machine instructions

经常用x/10s $esp 或者 x/gx $rsp之类的命令

其他的

gcc 在编译时候的 -g 选项 是为了 generate debugging information

要回宿舍了,要被蚊子要死了,醉了