【发布时间】:2020-09-10 13:09:16
【问题描述】:
我的核心是这样的:
(gdb) bt
#0 0x00007fe7bd2e3735 in vfprintf () from /lib64/libc.so.6
#1 0x00007fe7bd2ee329 in vfwprintf () from /lib64/libc.so.6
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb) i frame
Stack level 0, frame at 0x7fe7b73e6e20:
rip = 0x7fe7bd2e3735 in vfprintf; saved rip 0x7fe7bd2ee329
called by frame at 0x1b
Arglist at 0x7fe7b73e6e10, args:
Locals at 0x7fe7b73e6e10, Previous frame's sp is 0x7fe7b73e6e20
Saved registers:
rbx at 0x7fe7b73e6de8, rbp at 0x7fe7b73e6e10, r12 at 0x7fe7b73e6df0, r13 at 0x7fe7b73e6df8, r14 at 0x7fe7b73e6e00, r15 at 0x7fe7b73e6e08, rip at 0x7fe7b73e6e18
(gdb)
是否有机会查找即将打印的内容,以便我可以在我的代码中找到它?
【问题讨论】:
-
您未向我们展示的代码中一定存在错误。
-
valgrind可能有助于缩小范围。我认为@Jabberwocky 是在要求您发布代码。 -
反汇编 vfprintf 看看它使用了哪些寄存器?或者只是使用 vfprintf 编写一个玩具程序并反汇编调用站点
-
调用这个标准函数的代码是有问题的。您将不得不花时间(很抱歉,可能需要很多时间)来跟踪代码中出现问题的位置。这很可能是堆栈的主要覆盖——代码将大量数据复制到堆栈分配的缓冲区太小,并且践踏破坏了堆栈回溯数据,但函数尚未返回。找到它可能会令人沮丧,并且报价可能一经找到就解决了。
-
使用
x/s $rsi或x/ws $rsi查看第二个参数,*f*printf应该是格式字符串。