2017-05-03 10 views
5

तो मेरे पास एक नया फैंसी सीपीयू है जो avx2 निर्देश सेट का समर्थन करता है। यह बहुत अच्छा है, लेकिन जीडीबी रिवर्स डीबगिंग तोड़ता है। जब कोई ऑप्टिमाइज़ेशन कोड के साथ संकलित नहीं किया जाता है तब भी साझा लाइब्रेरीज़ का उपयोग करता है, जैसे कॉल मेमसेट() जो तब जाता है और मेमसेट के avx2 अनुकूलित संस्करण को आमंत्रित करता है। यह बहुत अच्छा है लेकिन avx2 gdb रिकॉर्ड द्वारा समर्थित नहीं है।जीडीबी रिवर्स डीबगिंग avx2

प्रक्रिया रिकॉर्ड 0x7ffff690dd80 पते पर निर्देश 0xc5 का समर्थन नहीं करता है।

0xc5 यहां वेक्स उपसर्ग है।

रिवर्स डीबगिंग एक सीपीयू के साथ बढ़िया काम करता है जो avx2 का समर्थन नहीं करता है। लाइब्रेरी कॉल के avx2 अनुकूलित संस्करणों का उपयोग न करने के लिए मैं libc आदि कैसे प्राप्त करूं ताकि मैं जीडीबी रिकॉर्ड, पीछे की तरफ इत्यादि का उपयोग कर सकूं?

मैं

LD_BIND_NOW=1 
LD_HWCAP_MASK=0 
compiling with -static 

की कोशिश की और एक पुराने मशीन पर डिबगिंग की कमी है, मैं विचारों से बाहर हूँ।

+1

आप किस प्रकार का जीएलबीसी का उपयोग कर रहे हैं? –

+1

2.23 जैसा कि उबंटू 16.04 amd64 arch पर भेजा गया है। cpu एक i7 xeon है जो avx2 – Hal

+1

का समर्थन करता है पहले से ही यहां पूछा गया था: http://stackoverflow.com/q/42451492/72178। – ks1322

उत्तर

1

आपके ग्लिबैक 2.23 के लिए उबंटू 16.04 amd64 पर भेजे गए अनुसार my binary kludge (1 bit patch) का अनुकूलन उसी कारण से किया गया है। पैकेज libc6 (2.23-0ubuntu7)https://packages.ubuntu.com/xenial/amd64/libc6 से डाउनलोड किया गया और फ़ाइल ld-2.23.so संपादित किया गया था (मूल की प्रतिलिपि रखने, या अलग रास्ता में समझौता बचाने के लिए और अपने स्वयं के द्विआधारी की interp अनुभाग बदल अलग रास्ता उपयोग करने के लिए):

83 3D 5B C9 20 00 06 cmpl $0x6, smth... 
7E 21     jle some_forward_label 
B8 07 00 00 00   mov $0x7, %eax 
31 C9     xor %ecx,%ecx 
0F A2     cpuid 

वहाँ the get_common_indeces: if (cpu_features->max_cpuid >= 7) __cpuid_count (7, 0, ... का कोड __get_cpu_features से बुलाया गया है। EAX=7 leaf of cpuid has all info needed to detect AVX2 support and enable it, इसलिए मैंने cpuid eax=0x7,ecx=0 के साथ खंड को छोड़ दिया और 0x7e 0x21 into 0x7f 0x21 बदलकर इसके परिणामों को स्मृति के कुछ हिस्सों में सहेज लिया।

तो, बाइनरी पैच 83 3D xx xx xx xx 06 7E xx B8 07 00 00 00 31 C9 0F A2 (जहां xx कोई बाइट हो सकता है) को 83 3D xx xx xx xx 06 7F xx B8 07 00 00 00 31 C9 0F A2 में बदलने की तरह है। आप इसे किसी भी हेक्स संपादक या कुछ बाइनरी diff के साथ कर सकते हैं। 2.23-0ubuntu7 में यह कोड 0x0193B0 पर है - 0x0193B9 7e में 7f में बदला जा सकता है।

पैच इसे गूंगा और वैश्विक स्तर पर पैच की गई फ़ाइल का उपयोग न करें यदि आपकी रूट एफएस सीएक्स के साथ ईएक्स = 7 सीपीयूइड लीफ सपोर्ट (प्री इंटेल कोर सीपीयू) या वर्चुअल मशीन में ऐसे पूर्व इंटेल कोर सीपीयू ("Pentium D 8xx/9xx", Pentium 4, Pentium M - will fail))।

आप पथ पर पैच की गई फाइल डाल सकते हैं जिसका नाम /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 के मूल पथ के बराबर या छोटा है (जो /lib/x86_64-linux-gnu/ld-2.23.so फ़ाइल में सिमलिंक करता है)। उदाहरण के लिए /lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2। फिर अपने प्रोग्राम निष्पादन योग्य (ईएलएफ) "/ lib_x86_64-linux-gnu_ld-linux-noAVX2" में स्ट्रिंग "/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2" स्ट्रिंग को प्रतिस्थापित करने के लिए समान हेक्सेडिटर का उपयोग करें। तो.2 ", या पैचेलफ टूल का उपयोग करें from the patchelf package:

cp /lib/x86_64-linux-gnu/ld-2.23.so /lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2 

bless /lib_x86_64-linux-gnu_ld-linux-noAVX2.so.2 
# or any other hex editor 

patchelf --set-interpreter /lib_x86_64-linux-gnu_ld-linux-no-AVX2.so.2 ./my_program 
संबंधित मुद्दे