2015-11-07 7 views
14

मैं एफएफएमपीईजी के लिए पैच पर काम कर रहा हूं और मुझे अपना कोड डीबग करने की आवश्यकता है। मैं एक बाहरी पुस्तकालय लोड कर रहा हूं, और विभिन्न लाइब्रेरी संस्करणों का परीक्षण करने के लिए, मेरे पास अलग-अलग फ़ोल्डर्स हैं। यह चुनने के लिए कि मैं किस का उपयोग करना चाहता हूं, मैं DYLD_LIBRARY_PATH=/path/to/lib/dir ./ffmpeg का उपयोग कर रहा हूं और यह ठीक काम करता है। लेकिन जब मैं इसे lldb के भीतर आज़माता हूं, तो यह dyld: Library not loaded और Reason: image not found कहता है। यह प्री-एक्सकोड 7.1 काम करने के लिए प्रयोग किया जाता था, लेकिन मैंने हाल ही में अपग्रेड किया और यह काम करना बंद कर दिया।अब मेरे पर्यावरण चर को आगे बढ़ाए क्यों नहीं?


यहाँ मेरी MVCE है:

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    char* str = getenv("DYLD_LIBRARY_PATH"); 
    if (str) puts(str); 
    else  puts("(null)"); 
    return 0; 
} 

इस कार्यक्रम चल रहा है के रूप में इस उत्पादन का उत्पादन:

$ ./a.out 
(null) 
$ DYLD_LIBRARY_PATH=/tmp ./a.out 
/tmp 

कि ठीक लग रहा है। लेकिन lldb यह विफल रहता है जब मैं का उपयोग करने का प्रयास करें:

$ DYLD_LIBRARY_PATH=/tmp lldb ./a.out 
(lldb) target create "./a.out" 
Current executable set to './a.out' (x86_64). 
(lldb) run 
Process 54255 launched: './a.out' (x86_64) 
(null) 
Process 54255 exited with status = 0 (0x00000000) 

वातावरण चर सेट करने के लिए अंदर lldb काम करता है की कोशिश कर रहा:

lldb ./a.out 
(lldb) target create "./a.out" 
Current executable set to './a.out' (x86_64). 
(lldb) env DYLD_LIBRARY_PATH=/tmp 
(lldb) run 
Process 54331 launched: './a.out' (x86_64) 
/tmp 
Process 54331 exited with status = 0 (0x00000000) 

lldb संस्करण (यह Xcode 7.1 से है):

$ lldb --version 
lldb-340.4.110 

प्रश्न: क्या यह एक विशेष नई "फीचर" है, या यह एलएलडीबी में एक नई बग है (या मैं पूरी तरह से पागल हूं और यह कभी भी काम करने के लिए उपयोग नहीं किया जाता है)? मैं काफी सकारात्मक एलएलडीबी DYLD_LIBRARY_PATH पर्यावरण चर को आगे बढ़ाने के लिए प्रयोग किया जाता हूं, तो अब यह कैसे नहीं आता है?


संपादित करें: यह ओएस एक्स 10.11.1 पर है।

+1

पुष्टि की [यहां] (https://www.mail-archive.com/[email protected]/msg00779.html) जेसन मोल्डा द्वारा (जो एलएलडीबी डेवलपर्स में से एक है)। –

उत्तर

23

यदि यह एल कैपिटन (ओएस एक्स 10.11) पर है, तो यह लगभग निश्चित रूप से सिस्टम इंटीग्रटी प्रोटेक्शन का दुष्प्रभाव है। System Integrity Protection Guide: Runtime Protections लेख से:

जब एक प्रक्रिया शुरू कर दी है, गिरी चेकों को देखने के लिए मुख्य निष्पादन योग्य डिस्क पर सुरक्षित है या एक विशेष प्रणाली पात्रता के साथ हस्ताक्षर किए है या नहीं। यदि कोई भी सत्य है, तो एक ध्वज यह इंगित करने के लिए सेट किया गया है कि यह संशोधन के विरुद्ध सुरक्षित है। ...

... किसी भी गतिशील लिंकर (dyld) वातावरण चर, जैसे DYLD_LIBRARY_PATH, जब शुभारंभ संरक्षित प्रक्रियाओं पर्ज कर रहे हैं।

इस फैशन में/usr/bin में सबकुछ सुरक्षित है। इसलिए, जब आप/usr/bin/lldb का आह्वान करते हैं, तो सभी DYLD_ * पर्यावरण चर शुद्ध हो जाते हैं।

यह Xcode.app या कमांड लाइन उपकरण के भीतर से lldb चलाने के लिए है, इसलिए की तरह काम करना चाहिए:

DYLD_LIBRARY_PATH=whatever /Applications/Xcode.app/Contents/Developer/usr/bin/lldb <whatever else> 

मैं नहीं मानता lldb की कि प्रति सुरक्षित है।/usr/bin/lldb वास्तव में केवल एक ट्रैम्पोलिन है जो एक्सकोड या कमांड लाइन टूल्स में संस्करण निष्पादित करता है, इसलिए आप अंततः एक ही चीज़ चला रहे हैं। लेकिन/usr/bin/lldb संरक्षित है इसलिए DYLD_ * वातावरण चर को चलाने के दौरान शुद्ध किया जाता है।

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

+0

हाँ, यह ओएस एक्स 10.11.1 पर है। यह तो दिलचस्प है. स्पष्ट स्पष्टीकरण के लिए धन्यवाद! – Cornstalks

+2

धन्यवाद। यह मेरी समस्या भी हल करता है (एल कैपिटन पर)। मैंने टाइपिंग को कम करने के लिए उपनाम 'alias lldb =/एप्लिकेशन/Xcode.app/सामग्री/डेवलपर/usr/bin/lldb' बनाया है। –

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