2012-04-10 10 views
13

मेरे पास एक जटिल सी ++ कोड है।'स्टैक स्मैशिंग पता चला' डीबग कैसे करें?

यह एक FastCGI कार्यक्रम, का उपयोग कर http://althenia.net/fcgicc

जब मैं एक looooong यूआरएल के लिए यह पूछते हैं, मैं

*** stack smashing detected ***: ./tileserve terminated 
Erreur de segmentation 

प्राप्त वास्तविक जीवन के लिए है, यह नहीं एक मुद्दा के बाद से मैं इतने लंबे समय यूआरएल का उपयोग कभी नहीं है, लेकिन इसका मतलब है कि कोई भी मेरे सर्वर को समाप्त कर सकता है .... मुझे यह पसंद नहीं है।

क्या कोई उपकरण है (और इसका उपयोग कैसे करें?) यह पता लगाने के लिए कि समस्या कहां दिखाई देती है?

संपादित करें: सोल्व

ठीक हल हो गया।

मैं

int len; 
char uri[200]; 

len = strlen(request.params[std::string("REQUEST_URI")].c_str()); 
printf("%d\n", len); 

if (len > 200) return 1; 

strcpy(uri, request.params[std::string("REQUEST_URI")].c_str()); 

कर रहा था कि ऐसा लगता है कि 200 भी लेन परीक्षण के लिए एक hight था। यह वास्तव में 194

में विफल रहता है तो मैंने किया:

if (len > 190) return 1; 

अब, यह ठीक है।

+2

स्टैक ट्रेस आपको एक संकेत दे सकता है। 'एररूर डी सेगमेंटेशन' – Mahesh

+4

+1 स्टैक ट्रेस क्या है? – trojanfoe

+0

के लिए – user1219721

उत्तर

14

यदि आप वेबसाइट पढ़ते हैं तो आपको पता चलेगा कि यह एक सी पुस्तकालय पर एक सरल सी ++ रैपर है।

#include <cstring> 
#include <cstdio> 

int main(int argc, char* argv[]) { 
    char buffer[16]; // ought to be sufficient 

    strcpy(buffer, argv[1]); 
    printf("%s", buffer); 
} 

इस कार्यक्रम का प्रयास करें::

सी पुस्तकालय के साथ एक ठेठ मुद्दा बफर लगने हैं

> ./test "a" 
a 
> ./test "abcdefghijklmnoprqstuvwxyz" 
??? 

क्योंकि बफर केवल 16 वर्ण हो सकते हैं, शेष वर्ण अपने अंत अतीत लिखा जाएगा । यह स्टैक तोड़ने, और अपरिभाषित व्यवहार है।

रनटाइम लाइब्रेरी या आपके ओएस के कई कार्यान्वयन कुछ स्थितियों में इस स्थिति का पता लगा सकते हैं और प्रोग्राम को समाप्त कर सकते हैं।

या तो आप कुछ गलत कर रहे हैं या लाइब्रेरी है।

समस्या का पता लगाने के लिए, आप वालग्रिंड का उपयोग कर सकते हैं या अपने प्रोग्राम को डीबगर में चला सकते हैं। वैकल्पिक रूप से, यदि आपका सिस्टम इसे अनुमति देता है, तो प्रोग्राम के मारे जाने पर आपके पास मेमोरी डंप हो सकता है। आप डीबगर में यह मेमोरी डंप भी देख सकते हैं।

+0

हाँ, मैं समझता हूं कि समस्या क्या है। मुद्दा यह पता लगाने के लिए है ... – user1219721

+0

@ user1219721: क्षमा करें, उस भाग को याद किया। एक डीबगर का उपयोग करें (लिनक्स पर वीसी ++ या जीडीबी में एकीकृत)। –

+0

वालग्रिंड यहां बेकार है, क्योंकि यह स्टैक-आधारित मेमोरी त्रुटियों का पता नहीं लगाता है - केवल स्मृति भ्रष्टाचार को ढेर करता है। –

0

आप वाल्ग्रिंड जैसे कुछ का उपयोग कर सकते हैं, या आपके कंपाइलर में स्थैतिक विश्लेषण हो सकता है जो आपको उन स्थानों को ढूंढ सकता है जहां आप ओवररायिंग बफर हो सकते हैं।

इसके अलावा आप स्ट्रोक के रूप में त्रुटि प्रवण कार्यों के उपयोग के लिए अपने कोड का ऑडिट कर सकते हैं और स्ट्रैन्पी जैसे सुरक्षित कार्यों के साथ उन्हें प्रतिस्थापित कर सकते हैं, या बेहतर अभी तक उन ऑब्जेक्ट्स का उपयोग कर सकते हैं जो std :: string जैसे अपनी स्मृति का प्रबंधन करते हैं।

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