2012-04-23 6 views
17

मुझे पता है कि gdb कमांड का उपयोग कर सेट पर पहले से घोषित चर के लिए अनुमति देता है।जीडीबी के साथ किसी दिए गए फ़ंक्शन के दायरे में एक चर घोषित करने के लिए कैसे?

क्या जीडीबी के लिए किसी दिए गए फ़ंक्शन के दायरे में गतिशील रूप से एक नया चर घोषित करना संभव है?

+10

क्या अच्छा है क्या करना होगा:

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

+0

@JamesMcLaughlin के साथ सहमत होने के बावजूद स्पष्ट है: ** नहीं **, यह केवल निरीक्षण के लिए है। –

+6

क्या आप वाकई एक gdb चर नहीं चाहते हैं? आप * अपनी सुविधा के लिए जीडीबी के संदर्भ में चर बना सकते हैं, जैसे 'set $ foo = ... 'और बाद में संदर्भ' $ foo'। स्पष्ट रूप से ऐसे चर चलने वाले कोड के लिए दृश्यमान नहीं हैं, हालांकि। – FatalError

उत्तर

14

सी (और शायद सी ++) कोड के लिए, यह बहुत कठिन होगा, क्योंकि अधिकांश कार्यान्वयन में ऐसा करने से स्टैक पॉइंटर को स्थानांतरित करना शामिल होगा, जिससे फ़ंक्शन का एक्ज़िट कोड विफल हो जाएगा क्योंकि यह अब आकार के मिलान से मेल नहीं खाता है ढेर फ्रेम। स्थानीय चरों तक पहुंचने वाले फ़ंक्शन में सभी कोड अचानक गलत स्थान को मारने का जोखिम उठाएंगे, जो भी खराब है।

तो, मुझे ऐसा नहीं लगता, नहीं।

6

कि कैसे मैं चर

(gdb) set $path=((ngx_path_t  **)ngx_cycle->paths.elts)[2] 
(gdb) print *$path 
    $16 = { 
     name = { 
      len = 29, 
      data = 0x80ed15c "/usr/local/nginx/fastcgi_temp" 
      }, 
     len = 5, 
     level = {1, 2, 0}, 
     manager = 0, 
     loader = 0, 
     data = 0x0, 
     conf_file = 0x0, 
     line = 0 
    } 
12

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

set $foo = alloc(sizeof(struct funcOutStruct)) 
func($foo) 
p *$foo 
free($foo) 
संबंधित मुद्दे