如何解决vfprintf中的segfault具有损坏的堆栈
我的核心看起来像这样:
(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)
是否有机会查找要打印的内容,以便在我的代码中找到它?
解决方法
由于堆栈似乎已损坏,因此无法查看代码中对vsprintf的调用来自何处。
我建议您使用'-Wformat' and '-Wformat-overflow'
的gcc标志编译代码。
从gcc文档(https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Warning-Options.html):
-Wformat 检查对printf和scanf等的调用,以确保提供的参数具有适合格式字符串的类型 指定,并以格式字符串指定转换 说得通。 ...
-Wformat-overflow 警告有关对格式化输入/输出功能(例如sprintf和vsprintf)的调用,可能会导致 目标缓冲区。 ...
如果您的代码包含很多编译警告(这是一个不正确的做法,可以忽略),并且您只需要格式警告,则可以通过添加编译标志{{1},将内部版本配置为将这些警告视为错误。 }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。