此行对我造成了段错误:
30 printf("st_name:\t%s\n", &p_str_tab[p->st_name]);
我试图在gdb中追踪它:
(gdb) p p_str_tab[p->st_name]
$11 = 0 '\000'
(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%s\n", 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 ]
答案 0 :(得分:1)
您可能想检查是否溢出堆栈。
答案 1 :(得分:1)
错误指令mov 0xc0(%rdi),%eax
表示eax = rdi->member
,其中member
位于偏移量0xc0。如果没有看到更多的反汇编,很难确定这是什么,但似乎stdout
或stdout
内的某些东西。错误指令不可能解除引用您的输入字符串。
你对stdout
做了什么不寻常的事吗?蛮力的方法是将printf
洒到各处(它可能无关紧要)并查看它开始崩溃的地方。就在那之前,某些东西被破坏了。
答案 2 :(得分:0)
必须是指针覆盖问题,请尝试valgrind。