Я могу напечатать память с помощью команды x в gdb, но если я использую printf, ошибка сегментации - PullRequest
6 голосов
/ 03 июля 2011

Эта строка вызывает у меня segfault:

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

Я могу напечатать память с помощью команды x GDB, но если я использую 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 ]

1 голос
/ 03 июля 2011

Неисправная инструкция mov 0xc0(%rdi),%eax представляет что-то вроде eax = rdi->member, где member имеет смещение 0xc0.Не видя больше разборки, трудно точно понять, что это такое, но кажется вероятным, что это stdout или что-то внутри stdout.Маловероятно, что ошибочная инструкция разыменовывает вашу входную строку.

Вы сделали что-нибудь необычное для stdout?Подход грубой силы должен был бы разбрызгивать printf повсюду (из того, что это, вероятно, не имеет значения) и видеть, где это начинает терпеть крах.Как раз перед тем, где что-то испортилось.

1 голос
/ 03 июля 2011

Возможно, вы захотите проверить, не переполняете ли вы стек.

0 голосов
/ 13 июля 2011

Должна быть проблема с указателем, попробуйте valgrind.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...