2010-11-21 12 views
6

Tôi đang gỡ lỗi một ứng dụng ghi trong ansi C, một chương trình nhiều luồng.
Thỉnh thoảng, trong luồng chính gây ra lỗi SIGSEGV.backtrace by SIGSEGV

(gdb) backtrace full 
#0 0x0000000000000000 in ??() 
No symbol table info available. 
#1 0x0000000000000000 in ??() 
No symbol table info available. 
(gdb) info registers 
rax   0x1  1 
rbx   0x0  0 
rcx   0x0  0 
rdx   0x2  2 
rsi   0x458e7aa0  1166965408 
rdi   0x0  0 
rbp   0x0  0x0 
rsp   0x458e7b60  0x458e7b60 
r8    0x458e7b20  1166965536 
r9    0x0  0 
r10   0x0  0 
r11   0x206 518 
r12   0x2aaaac400e70 46912522686064 
r13   0x2aaaac514090 46912523813008 
r14   0x1  1 
r15   0x18505f10  407920400 
rip   0x0  0 
eflags   0x10206 [ PF IF RF ] 
cs    0x33  51 
ss    0x2b  43 
ds    0x0  0 
es    0x0  0 
fs    0x63  99 
gs    0x0  0 
fctrl   0x37f 895 
fstat   0x0  0 
ftag   0xffff 65535 
fiseg   0x0  0 
fioff   0x0  0 
foseg   0x0  0 
fooff   0x0  0 
fop   0x0  0 
mxcsr   0x1f80 [ IM DM ZM OM UM PM ] 
(gdb) 

Thông tin này là từ tệp lõi, tôi không thể làm gì để tìm ra sự cố ở đâu?

Sửa: tất cả các tập tin nguồn được biên dịch với cờ như sau

gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/redisconnector.d" -MT"src/redisconnector.d" -o"src/redisconnector.o" "../src/redisconnector.c" 
+0

Vui lòng liệt kê tất cả các tùy chọn biên dịch và phiên bản GCC – osgx

+1

của bạn, tôi đã chỉnh sửa câu hỏi. – secmask

Trả lời

2

Biên dịch lại ứng dụng bằng tùy chọn "-g";

Sử dụng gdb không với các tập tin cốt lõi, nhưng để chạy toàn bộ ứng dụng:

gdb --args ./application application_options 

sau đó "chạy" lệnh của gdb.

Chạy từ gdb sẽ phát hiện SIGSEGV và gdb sẽ được tập trung vào chuỗi không thành công.

+1

bỏ phiếu, chạy ứng dụng trong gdb là ý tưởng tốt. – secmask

1

Vâng, trước tiên bạn sẽ cần phải biên dịch với gỡ lỗi kích hoạt để backtrace của bạn có một cái gì đó có thể sử dụng. Cờ là gcc -g

+0

Tôi đã biên dịch nó với -g3, nhưng đó là tất cả những gì nó có thể hiển thị. – secmask

3

Điểm RIP của bạn đến 0. Điều này có thể do tràn ngăn xếp. RBP của bạn cũng là 0, do đó lệnh backtrace gdb sẽ không cho bạn biết gì.

+0

Để thêm, nếu đó là một tràn ngăn xếp thì bạn đang viết qua kết thúc của một mảng (hoặc chuỗi) rất có thể. Tôi sẽ kiểm tra ở đó trước. – OmnipotentEntity

+0

@OmnipotentEntity Tôi nghĩ rằng bạn có nghĩa là tràn bộ đệm khi bạn viết qua kết thúc của một mảng? –

+0

Vâng, đó là điều tương tự, nếu bộ đệm của bạn nằm trên ngăn xếp. Một tràn bộ đệm là bất kỳ bộ đệm, ngăn xếp, đống, vv Một tràn ngăn xếp cụ thể ghi đè bộ đệm của ngăn xếp. Bạn có thể nói điều này cụ thể là tràn ngăn xếp bởi vì con trỏ chỉ dẫn bị vặn. :) – OmnipotentEntity