2010-06-18 31 views
5

मेरे पास दो समान 64 बिट Centos 5 मशीनें हैं, जो नेटवर्क हैं, और उनके/घर के माउंट साझा करते हैं। मैं एक पर एक साधारण हैलो वर्ल्ड प्रोग्राम संकलित करता हूं, और फिर मैंने यह पता लगाया है कि एक मशीन पर जीडीबी का उपयोग कैसे किया जाए ताकि इसे अन्य मशीन पर दूरस्थ रूप से डीबग किया जा सके। यह ठीक काम करता प्रतीत होता है जब हर कोई 64 उद्धरण के लिए चूक जाता है।सेंटोस 5 के साथ 64 बिट मशीन पर 32 बिट बाइनरी के साथ जीडीबी और जीडीएसएवरवर का उपयोग स्मृति 5 या स्मृति बुरी तरह के डेटा के बारे में शिकायत करता है

हालांकि, अगर मैं 32 बिट बाइनरी उत्पन्न करने के लिए अपनी हैलो वर्ल्ड के साथ -एम 32 संकलित करता हूं, जिस तरह से हमारी पूर्ण प्रणाली संकलित की जा रही है, तो मैं यह नहीं समझ सकता कि जीडीबी और जीडीएस सर्वर को सही ढंग से कनेक्ट करने के तरीके को कैसे प्राप्त किया जाए। इससे पहले कि हम इसे अपने पूर्ण सिस्टम पर आज़माएं, मुझे लगता है कि मुझे इसे हैलो के साथ काम करना चाहिए। मैं gdb और gdbserver को जोड़ने का प्रयास करने के तरीके के आधार पर, मुझे या तो बुरी तरह से स्वरूपित रजिस्टरों, आर्किटेक्चर विसंगतियों, या अवैध स्मृति संदर्भों के बारे में चेतावनियों के बारे में संदेश मिलते हैं।

मुझे लगता है कि -m32 के मेरे संकलन में क्या प्रभाव है और gdb और gdbserver या सही ऑर्डर को आर्किटेक्चर या फ़ाइलों या कुछ निर्दिष्ट करने के बारे में कोई जानकारी नहीं है। :(

क्या यह एक 64 बिट linux बॉक्स पर एक 32 बिट (-m32) निष्पादन पर gdb और gdbserver उपयोग करने के लिए ले करता है?

नीचे उदाहरण हैं, और धन्यवाद,

जेरी

हैलो।सीपीपी:

#include <iostream> 
int main(int argc, char *argv[]) 
{ 
    std::cout << "Hello World." << std::endl; 
    return -1; 

} 

यहाँ तीन रन हैं:

  1. gdb में, सेट वास्तुकला i386/तो gdbserver => बुरा वास्तुकला
  2. gdb में, सेट वास्तुकला i386/फ़ाइल नमस्ते करने के लिए कनेक्ट/तो कनेक्ट gdbserver => बुरा वास्तुकला के लिए
  3. gdb में, वास्तुकला सेट (गलत) i386: x86-64/फ़ाइल नमस्ते/फिर gdbserver = कनेक्ट> तक नहीं पहुंच पा स्मृति

या थोड़ा में और अधिक विस्तार:

==============================

प्रत्येक रन के लिए , दूरस्थ gdbserver ने कहा:


    $ gdbserver --multi rdev6:2010 hello 
    Process hello created; pid = 32603 
    Listening on port 2010 
    Remote debugging from host 134.51.26.149 
    readchar: Got EOF 
    Remote side has terminated connection. GDBserver will reopen the connection. 
    Listening on port 2010 

और हमारे स्थानीय पर:

============================ ==

  • मान लीजिए कि यह i386 32 बिट है, आर्किसी सेट करना i386 के लिए है, तो जोड़ने ध्यान दें: gdb तरफ, निष्पादन योग्य निर्दिष्ट नहीं किया गया है या उसे लोड

    $ gdb 
    GNU gdb Fedora (6.8-37.el5) 
    his GDB was configured as "x86_64-redhat-linux-gnu". 
    (gdb) set archi i386 
    The target architecture is assumed to be i386 
    (gdb) target extended-remote rdev6:2010 
    Remote debugging using rdev6:2010 
    warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64 
    Remote register badly formatted: T0506:0000000000000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b; 
    here: 0000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b; 
    Try to load the executable by `file' first, 
    you may also check `set/show architecture'. 
    (gdb) 

=================== ===========

  • मान लिया जाये कि यह i386 है 32 बिट,, i386 के लिए Archi की स्थापना तो जोड़ने ध्यान दें: gdb तरफ, निष्पादन योग्य फ़ाइल के साथ लोड किया गया है

    $ gdb 
    GNU gdb Fedora (6.8-37.el5) 
    his GDB was configured as "x86_64-redhat-linux-gnu". 
    (gdb) set archi i386 
    The target architecture is assumed to be i386 
    (gdb) file hello 
    Reading symbols from /home/j/hello...done. 
    (gdb) target extended-remote rdev6:2010 
    Remote debugging using rdev6:2010 
    warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64 
    Remote register badly formatted: T0506:0000000000000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b; 
    here: 0000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b; 
    Try to load the executable by `file' first, 
    you may also check `set/show architecture'. 
    (gdb) sho archi 
    The target architecture is assumed to be i386 
    (gdb) 

==============================

  • मान लिया जाये कि (जो गलत होना चाहिए) कि यह i386 है: x86-64, i386 के लिए Archi की स्थापना: x86-64, तो टिप्पणी जोड़ने: gdb तरफ, निष्पादन योग्य फ़ाइल के साथ लोड किया गया है

    $ gdb 
    GNU gdb Fedora (6.8-37.el5) 
    This GDB was configured as "x86_64-redhat-linux-gnu". 
    (gdb) set archi i386:x86-64 
    The target architecture is assumed to be i386:x86-64 
    (gdb) file hello 
    Reading symbols from /home/j/hello...done. 
    (gdb) show archi 
    The target architecture is assumed to be i386:x86-64 
    (gdb) target extended-remote rdev6:2010 
    Remote debugging using rdev6:2010 
    [New Thread 32667] 
    Cannot access memory at address 0x800000008 
    (gdb) 

उत्तर

4

आप 32-बिट प्रक्रिया 64 का उपयोग कर डिबग करने के लिए चाहते हैं -बीटी जीडीबी/जीडीएस सर्वर, आपको जीडीबी का एक नया संस्करण चाहिए।

gdbserver/ChangeLog: 

2009-05-12 Doug Evans <[email protected]> 

     Biarch support for i386/amd64 gdbserver. 

वैकल्पिक रूप से, आप

./configure CC='gcc -m32' 

चलाकर gdb/gdbserver आप पहले से ही 32-बिट मोड में स्रोत से है निर्माण और प्रयोग gdb32/gdbserver32 अपनी प्रक्रियाओं डिबग करने के लिए कर सकते हैं: विशेष रूप से, आप इस की जरूरत है । मुझे ऐसा करने का कोई फायदा नहीं दिख रहा है - हालांकि जीडीबी के नए संस्करणों में कई फिक्स, स्पीडअप और एसटीएल सुंदर प्रिंटर अच्छे हैं।

+0

आपको बहुत धन्यवाद, मैं वास्तव में आपकी मदद की सराहना करता हूं, और मैं कल काम पर कोशिश करूंगा। –

+0

और हाँ, मैंने 2 दिन पहले नवीनतम gdbserver के लिए मैन्युअल पर देखा, और जब मुझे सुंदर प्रिंटर मिले तो लगभग साजिश रहीं। –

+0

एक बहुत पुराने विषय को पुनर्जीवित करने के लिए खेद है, लेकिन मुझे आश्चर्य है कि जीडीबी अपडेट किए बिना कोई रास्ता है या नहीं। मैं कनेक्ट करने के लिए एक विंडोज मशीन पर काम कर रहा हूं, तो क्या मैं विंडोज़ के लिए 32 बिट मोड जीडीबी बना सकता हूं? –