在调试剥离的程序时,在gdb中加载一个假的调试符号

时间:2016-06-17 07:37:26

标签: c linux gdb x86-64 disassembly

我正在使用gdb调试已剥离的程序。

(gdb) bt
#0  0x00007fffcb443650 in fooSnprintf () from ./install.so.1

我知道第三个参数是sting格式:

(gdb) print (char*)$rdx
$9 = 0x7fffe8dd4050 "%u %s"

如果加载了真正的调试符号,如何在断点处停止gdb show function args?

Breakpoint 1, fooSnprintf (a=0, b=0, fmt=0x40060a "%u %s") at test.c:3

我知道hook-stop,但它是全局的,会触发任何断点。

这有效,但不方便:

define hook-stop
    if $rip == fooSnprintf
        print (char*)$rdx
    end
end

2 个答案:

答案 0 :(得分:1)

您可以使用commands指令将命令与特定断点关联:

break fooSnprintf
commands
print (char*)$rdx
end

有关详细信息,请参阅here

答案 1 :(得分:1)

制作了一个虚假的源文件。

[root@softiwarp-1 ~]# cat fooSnprintf.c
void padding() {
__asm__ volatile (
"\n nop"
"\n nop"
"\n nop"
"\n nop"
"\n nop"
"\n nop"
"\n nop"
"\n nop"
"\n nop"
"\n nop"
"\n nop"
"\n nop"
"\n nop"
"\n nop"
);
}

int fooSnprintf(void *a, void *b, char *fmt, ...) {
        return a && b && fmt;
}

使用-O2编译了一个共享库(重要的是,因为-O0 gdb期望函数将寄存器放入堆栈中。通过反复试验选择了一个合适的加载地址:

[root@joe ~]# gcc -fPIC -g -O2 -shared -o fooSnprintf.so fooSnprintf.c \
-Wl,-Ttext-segment=$(printf 0x%x $((0x00007fffcb443650 - 1392)))

加载

(gdb) symbol-file /root/fooSnprintf.so
Load new symbol table from "/root/fooSnprintf.so"? (y or n) y
Reading symbols from /root/fooSnprintf.so...done.
(gdb) c
Continuing.

Breakpoint 2, fooSnprintf (a=0x7fffc9ef0560, b=0xc8, fmt=0x7fffe8dd4050 "%u %s") at fooSnprintf.c:21
21              return a && b && fmt;