c语言 - 我可以使用 gdb 的 x 命令打印内存,但是如果我使用 printf,分割错误



此行导致我出现segfault:

30              printf("st_name:t%sn", &p_str_tab[p->st_name]);

我试着在gdb:中找到它

(gdb) p p_str_tab[p->st_name]
$11 = 0 '00'
(gdb) p &p_str_tab[p->st_name]
$12 = 0x2aaaaaab0000 ""
(gdb) x/16s 0x2aaaaaab0000
0x2aaaaaab0000:  ""
0x2aaaaaab0001:  ".symtab"
0x2aaaaaab0009:  ".strtab"
(gdb) call printf("st_name:t%sn", 0x2aaaaaab0000)
Program received signal SIGSEGV, Segmentation fault.
0x00000034f4042729 in vfprintf () from /lib64/libc.so.6
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on".
Evaluation of the expression containing the function

我可以用gdb的x命令打印内存,但如果我使用printf,则会出现分段错误。

为什么?

根据意见要求更新:

(gdb) x/1i $rip 
0x34f4042729 <vfprintf+57>: mov    0xc0(%rdi),%eax
(gdb) info reg 
rax            0x54 84
rbx            0x34f3e1bbc0 227429956544
rcx            0x0  0
rdx            0xffffffffffffffb0   -80
rsi            0x401b08 4201224
rdi            0x600908 6293768
rbp            0x7fffffffe6e0   0x7fffffffe6e0
rsp            0x7fffffffe040   0x7fffffffe040
r8             0x2aaaaaabf210   46912496202256
r9             0x34f4351780 227435419520
r10            0x1238   4664
r11            0x648    1608
r12            0x0  0
r13            0x7fffffffe9c0   140737488349632
r14            0x0  0
r15            0x0  0
rip            0x34f4042729 0x34f4042729 <vfprintf+57>
eflags         0x10202  [ IF RF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0
fctrl          0x37f    895
fstat          0x0  0
ftag           0xffff   65535
---Type <return> to continue, or q <return> to quit---
fiseg          0x0  0
fioff          0x0  0
foseg          0x0  0
fooff          0x0  0
fop            0x0  0
mxcsr          0x1f80   [ IM DM ZM OM UM PM ]

您可能需要检查堆栈是否溢出。

错误指令mov 0xc0(%rdi),%eax表示类似eax = rdi->member的东西,其中member位于偏移量0xc0处。如果没有看到更多的拆解,很难确定这是什么,但似乎很可能是stdoutstdout内部的东西。出现错误的指令不太可能取消对输入字符串的引用。

你对stdout做了什么不寻常的事吗?一种暴力的方法是到处撒printf(可能无关紧要的东西(,看看它从哪里开始崩溃。就在那之前,有些东西被破坏了。

必须是指针覆盖问题,请尝试valgrind。

相关内容

最新更新