2011-07-03 33 views
6

此行是造成段錯誤對我說:我可以打印使用gdb的x命令的內存,但如果我用printf,分段錯誤

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,則會出現分段錯誤。

爲什麼?在評論需要

UPDATE:

(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

它有助於查看感興趣的代碼,特別是'&p_str_tab [p-> st_name]是什麼; gdb'p's應該有所幫助,但是我看不到有效性,肯定會漏掉一些東西;關於x,是否有可能gdb可以安全地讀取比程序本身可以訪問更多的內存?我應該檢查 – ShinTakezou

+0

@ShinTakezou,'&p_str_tab [p-> st_name]'指向'0x2aaaaaab0000'處的符號表,如上所示。 –

+0

你可以在SEGV之後做'x/1i $ rip'和'info reg'嗎? – ninjalj

回答

0

必須是指針超出問題,請嘗試valgrind。

1

你可能要檢查是否你溢出堆棧。

+0

如何查看? –

+0

由於錯誤指令沒有引用堆棧,所以堆棧溢出極不可能與問題有關。 –

1

錯誤指令mov 0xc0(%rdi),%eax表示類似eax = rdi->member的地方,其中member位於偏移量0xc0。沒有看到更多的反彙編,很難知道這是什麼是肯定的,但它似乎可能是stdoutstdout內的東西。錯誤指令不可能取消引用輸入字符串。

你做過什麼不尋常的事情了嗎stdout?蠻力的方法是將printf隨處可見(可能無關緊要),看看它在哪裏開始崩潰。就在這之前,某些東西被損壞了。

相關問題