我正在使用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
答案 0 :(得分:1)
答案 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;