2010-11-21 9 views
6

द्वारा बैकट्रैक मैं कई थ्रेड प्रोग्राम, ansi सी में एक एप्लिकेशन लिखने को डिबग कर रहा हूं।
कभी-कभी, मुख्य धागे में एक 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) 

यह जानकारी कोर फ़ाइल से है, मैं लिनक्स वातावरण में डिबग के साथ बहुत परिवार नहीं कर रहा हूँ, वहाँ कुछ भी मैं कहाँ समस्या है खोजने के लिए कर सकते हैं?

संपादित: स्रोत फ़ाइलों के सभी, ध्वज के साथ संकलित किए जाते हैं का पालन के रूप में

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

कृपया, अपने सभी संकलन विकल्प और जीसीसी – osgx

+1

के संस्करण को ठीक करें, मैंने प्रश्न संपादित किया है। – secmask

उत्तर

2

"-g" विकल्प के साथ एप्लिकेशन को पुन: संकलित करें;

Gdb उपयोग नहीं कोर फाइलों के साथ है, लेकिन पूरे आवेदन को चलाने के लिए:

gdb --args ./application application_options 

फिर "रन" gdb की कमान।

जीडीबी से चलना एसआईजीएसईजीवी का पता लगाएगा, और जीडीबी असफल धागे पर केंद्रित होगा।

+1

वोट, जीडीबी में आवेदन चलाने का अच्छा विचार है। – secmask

1

खैर पहले आप सक्षम ताकि आपके पश्व-अनुरेखन कुछ प्रयोग करने योग्य है डिबगिंग के साथ संकलित करने के लिए की आवश्यकता होगी। ध्वज gcc -g

+0

मैंने इसे पहले ही -g3 के साथ संकलित कर लिया है, लेकिन यह सब कुछ दिखा सकता है। – secmask

3

आपका आरआईपी अंक 0 पर है। यह शायद एक स्टैक ओवरफ़्लो के कारण होता है। आपका आरबीपी भी 0 है, इसलिए backtrace gdb कमांड आपको कुछ भी नहीं बताएगा।

+0

जोड़ने के लिए, यदि यह एक स्टैक ओवरफ़्लो है तो आप सबसे अधिक संभावना वाले सरणी (या स्ट्रिंग) के अंत में लिख रहे हैं। मैं पहले वहाँ जांचूँगा। – OmnipotentEntity

+0

@OmnipotentEntity मुझे लगता है कि जब आप किसी सरणी के अंत में लिखते हैं तो आपको बफर ओवरफ़्लो का मतलब है? –

+0

ठीक है, यह वही बात है, यदि आपका बफर स्टैक पर है। एक बफर ओवरफ्लो कोई बफर, स्टैक, हीप इत्यादि है। एक स्टैक ओवरफ़्लो विशेष रूप से स्टैक के बफर को ओवरराइट कर रहा है। आप यह बता सकते हैं कि यह विशेष रूप से एक स्टैक ओवरफ़्लो है क्योंकि निर्देश पॉइंटर खराब हो गया है। :) – OmnipotentEntity

संबंधित मुद्दे

 संबंधित मुद्दे