2010-02-02 17 views
28

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

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

अद्यतन:

मुझे लगता है कि मैं पर्याप्त जानकारी नहीं दी थी। यूनिक्स मैं के बारे में बात कर रहा था MacOS एक्स (भले ही कुछ लोगों का कहना है अपने वास्तव में पूरी तरह से नहीं यूनिक्स) था, और मैं लोड पुस्तकालयों एक प्रक्रिया है खोजने के लिए एक तरह से तलाश कर रहे थे और मैं सी/सी में यह सब करने की ज़रूरत ++।

उत्तर

5

आप lsof उपयोग कर सकते हैं। अधिक जानकारी के लिए मैन पेज देखें। एक और उपकरण strace है। यदि एक प्रक्रिया शुरू की है, तो आप ps -ef पाइप grep के लिए, या pgrep जैसे उपकरणों के साथ-साथ उपयोग कर सकते हैं देखने के लिए। वापसी मूल्य के लिए जांचें कि क्या यह निकला है या नहीं।

11

lsof स्थापित नहीं है, तो आप कर सकते हैं बस cat/proc/$ पीआईडी ​​/ नक्शे

आप भी ldd साथ डिस्क निष्पादनयोग्य पर जांच के लिए वे क्या libs खुल जाएगा देखने के लिए कर सकते हैं (लेकिन वह दिखाई नहीं देता पुस्तकालयों खोला गतिशील रूप से dlopen() का उपयोग कर)।

नई प्रक्रियाओं की निगरानी के लिए, आप संभावित रूप से नई संख्यात्मक निर्देशिकाओं के निर्माण/विनाश की निगरानी के लिए/proc पर एक inotify घड़ी जोड़ सकते हैं।

अद्यतन: काम नहीं करता है/proc पर inotify, लेकिन वहाँ जाहिरा तौर पर विकल्प हैं, को देखने के this thread

39

सोलारिस pldd है। लिनक्स के लिए आप एक चलने वाली प्रक्रिया पर निष्पादन पर ldd या pmap फोन या मैप किए गए पुस्तकालयों के लिए /proc/PID/maps पर गौर कर सकते हैं।

+1

'pldd' मार्च 2012 में लिनक्स में जोड़ा गया था। [Glibc 2.15 रिलीज घोषणा] (http://savannah.gnu.org/forum/forum.php?forum_id=7163) – Mikel

+0

जानना अच्छा है, धन्यवाद। –

+5

मैक ओएस एक्स [ 'otool -L'] (http://developer.apple.com/library/mac/#documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html) के लिए' ldd' के बराबर है –

2

मैं यह करने के लिए कोशिश कर रहा हूं (और असफल)। Mach_vm_read और vm_region_recurse_64 देखें। vmmap और एप्पल के क्रैश रिपोर्टर की तरह बंद स्रोत आवेदन भी उन तरीकों, साथ ही खुले स्रोत GDB का उपयोग कर ऐसा करते हैं। आप किसी उत्तर के लिए वहां देखने का प्रयास कर सकते हैं, लेकिन स्रोत पढ़ने के लिए चुनौतीपूर्ण है।

8

मैक ओएस एक्स पर आप प्रक्रिया के लिए मैप किए गए मेमोरी क्षेत्रों की सूची प्राप्त करने के लिए vmmap $pid का उपयोग कर सकते हैं। यह सभी भारित पुस्तकालयों को दिखाता है (कम से कम यह मेरे लिए यहां 10.7.5 पर काम करता है)।

ps -A आपको सभी प्रक्रियाओं की एक सूची देगा, इसलिए आपको vmmap $pid के साथ उपयोग के लिए आपकी प्रक्रिया आईडी $ पिड प्राप्त करेगा। lsof -p $pid भी काम करता है।

प्रश्न सी ++ से गतिशील विधि के लिए पूछ रहा है। आप इन आदेशों के साथ मतदान कर सकते हैं और परिणामों का विश्लेषण कर सकते हैं, हालांकि आप तेजी से लोड/अनलोड ईवेंट याद कर सकते हैं।

lsof बीएसडी लाइसेंस के तहत ओपन सोर्स सॉफ्टवेयर है। इसके स्रोत कोड में कोई संदेह नहीं है कि सी/सी ++ से इसे कैसे किया जाए। देखें: http://en.wikipedia.org/wiki/Lsof

0

मेरे पास कोई विशिष्ट उत्तर नहीं है जिसे आप ढूंढ रहे हैं, लेकिन मेरे पास कुछ नज़दीक है, जो शायद आपको जो चाहिए वह करीब ले जाएगा।आप किसी विशिष्ट बाइनरी (नहीं प्रक्रिया) के जुड़े हुए पुस्तकालय प्रदर्शित कर सकते हैं:

  1. स्थापित xcode https://developer.apple.com/xcode/
  2. निष्पादित करें: otool एल PATH_TO_BINARY

उदाहरण:

chris$ otool -L /usr/local/bin/mtr 
mtr: 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0) 
    /usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 46.1.0) 
3

पर ओएस एक्स, बस DYLD_PRINT_LIBRARIES

export DYLD_PRINT_LIBRARIES=1 
./your_process 
सेट करने की आवश्यकता है
संबंधित मुद्दे