2011-07-03 9 views
6

Esta línea está causando segfault a mí:puedo imprimir la memoria con el comando x del BGF, pero si uso printf, fallo de segmentación

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

He tratado de rastrear en 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 

Puedo imprimir la memoria con el comando x de gdb, pero si uso printf, fallo de segmentación.

¿Por qué?

ACTUALIZACIÓN como se requiere en el comentario:

(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

ayudaría a ver el código interesado, en particular lo que '& p_str_tab [p-> st_name]' es; gdb 'p's debería ayudar, pero no puedo ver la estratagema en efecto, seguramente me falta algo; sobre x, ¿es posible que gdb pueda leer con seguridad más memoria de la que el programa puede acceder? Debería marcar – ShinTakezou

+0

@ShinTakezou, '& p_str_tab [p-> st_name]' apunta a la tabla de símbolos en '0x2aaaaaab0000' como se indica arriba. –

+0

¿Se puede hacer un 'x/1i $ rip' y' info reg' después de SEGV? – ninjalj

Respuesta

0

Debe haber un problema de sobrepasamiento del puntero, pruebe valgrind.

1

Es posible que desee comprobar si usted está desbordando la pila.

+0

¿Cómo verificarlo? –

+0

Como la instrucción de fallas no hace referencia a la pila, es muy poco probable que el desbordamiento de la pila tenga algo que ver con el problema. –

1

La instrucción de fallas mov 0xc0(%rdi),%eax representa algo así como eax = rdi->member donde member está en el desplazamiento 0xc0. Sin ver más desmontaje, es difícil saber de qué se trata, pero parece probable que sea stdout o algo dentro de stdout. No es probable que la instrucción de fallas esté desreferenciando su cadena de entrada.

¿Has hecho algo inusual en stdout? Un enfoque de fuerza bruta sería rociar printf en todas partes (de lo que probablemente no importe) y ver dónde empieza a fallar. Justo antes de eso es cuando algo se corrompió.

Cuestiones relacionadas