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

时间:2011-07-03 07:27:31

标签: c gdb

此行对我造成了段错误:

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 ]

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

错误指令mov 0xc0(%rdi),%eax表示eax = rdi->member,其中member位于偏移量0xc0。如果没有看到更多的反汇编,很难确定这是什么,但似乎stdoutstdout内的某些东西。错误指令不可能解除引用您的输入字符串。

你对stdout做了什么不寻常的事吗?蛮力的方法是将printf洒到各处(它可能无关紧要)并查看它开始崩溃的地方。就在那之前,某些东西被破坏了。

答案 2 :(得分:0)

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