gdb "प्रक्रिया-आईडी के लिए Mach कार्य पोर्ट खोजने में असमर्थ" त्रुटि के साथ विफल रहता है


138

मेरा ऐप ठीक चलता है लेकिन gdb इसे निम्न त्रुटि के साथ डीबग करने में विफल रहता है

(gdb) run
Starting program: /path/to/app 
Unable to find Mach task port for process-id 83767: (os/kern) failure (0x5).

मैं ओएस एक्स लॉयन पर हूं। GDB संस्करण है

$ gdb --version
GNU gdb 6.3.50-20050815 (Apple version gdb-1752) (Sat Jan 28 03:02:46 UTC 2012)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".

मुझे लगता है कि यह पोस्ट मदद कर सकती है: stackoverflow.com/questions/10221448/…
कोडी कोडमोंकी

जवाबों:


64

स्नो लेपर्ड और बाद में मैक ओएस संस्करणों में, यह gdbनिष्पादन योग्य कोडिंग करने के लिए पर्याप्त नहीं है ।

इसे काम करने के लिए आपको इस गाइड का पालन करना होगा: http://www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

गाइड बताता है कि इसे कैसे करना है lldb, लेकिन इसके लिए प्रक्रिया बिल्कुल समान है gdb


12
उन निर्देशों ने MacPorts के साथ OSX 10.9.2 पर मेरे लिए काम नहीं किया, लेकिन इसने किया: sourceware.org/gdb/wiki/BuildingOnDarwin
simpleuser

यह काम करता हैं! लेकिन क्या आप समझा सकते हैं कि sudo security add-trustरेखा क्या कर रही है? क्या मैं .cerअब अपने डेस्कटॉप से ​​फ़ाइल को हटा सकता हूं ?
श्रीजीत रामकृष्णन

9
codesign -s gdb_codesign `which gdb` इस गाइड के बाद मदद करता है
20:05

या sudo codesign -s gdb_codesign `which gdb-apple` macOS sierra पर।
sdive

3
नवीनतम OS के लिए, लिंक ने काम किया
yuxuan

144

जब मैं बदलता हूं तो यह काम करता है sudo gdb executableFileName! :)


2
धन्यवाद। काम करने के लिए gdb प्राप्त करने के लिए इस प्लस कोड पर हस्ताक्षर करने की आवश्यकता थी। मैंने gdb रूट एक्सेस दिया (जैसा कि यहां बताया गया है stackoverflow.com/questions/10476154/… ) इसलिए मुझे हर बार sudo टाइप नहीं करना पड़ा। संपादित करें - यहां एक बेहतर दृष्टिकोण मिला: stackoverflow.com/a/10441587/305149
Aneil Mallavarapu

14
इसे रूट के रूप में चलाएं? क्या आप गंभीर हैं? सबसे खराब "समाधान"।
इक्विडेमॉइड

7
@Equidamoid gdbरूट के रूप में चलाना इतना बुरा क्यों होगा ? मैं सिर्फ उत्सुक था क्योंकि यह सिर्फ एक डिबगर है।
इस प्रयोग की जरूरत है

इसे जड़ के रूप में चलाने से क्या होगा? यह आपके द्वारा लिखा गया कोड है, और मैं इसके परिणामों को नहीं समझता
COLD ICE

4
@ सामान्य रूप से आप एस्केलेटेड विशेषाधिकारों के साथ प्रक्रियाओं को नहीं चलाना चाहते हैं (विशेष रूप से मूल के रूप में शीर्ष पर आगे बढ़े हुए) क्योंकि सामान्य रूप से उन्हें सिस्टम पर चीजों को संशोधित करने या 1024 से कम पोर्ट खोलने की आवश्यकता नहीं है (उच्च पोर्ट हो सकते हैं) गैर प्रणाली / गैर रूट उपयोगकर्ताओं द्वारा उपयोग किया जाता है)। यहां तक ​​कि अगर आप अपने स्वयं के कोड पर "भरोसा" करते हैं, तो इसका मतलब यह नहीं है कि आपने कोई ऐसी गलती नहीं की है, जो इसे rm -rf /या कुछ ऐसे विनाशकारी विनाश का कारण बनती है जहां आप अपने कंप्यूटर को शुरू करने और सामान्य रूप से संचालित करने के लिए कुछ कॉन्फ़िगरेशन / बायनेरिज़ को ओवरराइट करते हैं।
शॉनहुसैन

32

आपको प्रमाणपत्र बनाने और gdb पर हस्ताक्षर करने की आवश्यकता है:

  • ओपन एप्लिकेशन "कीचेन एक्सेस" (/ एप्लीकेशन / यूटिलिटीज / किचेन एक्सेस। एप)
  • ओपन मेन्यू / किचेन एक्सेस / सर्टिफिकेट असिस्टेंट / सर्टिफिकेट बनाएं ...
  • एक नाम चुनें (उदाहरण में जीडीबी-सर्टिफिकेट), "सेल्फ साइनड रूट" के लिए "आइडेंटिटी टाइप" सेट करें, "सर्टिफिकेट टाइप" को "कोड साइनिंग" पर सेट करें और "लेट मी ओवरफॉल को ओवरराइड करें" का चयन करें। "जारी रखें" पर क्लिक करें। आप पूर्वनिर्धारित 365 दिनों की अवधि को 3650 दिनों तक बढ़ाना चाह सकते हैं।
  • "जारी रखें" पर कई बार क्लिक करें जब तक आप "प्रमाणपत्र के लिए एक स्थान निर्दिष्ट करें" स्क्रीन पर नहीं आते हैं, तब "कीचेन टू सिस्टम" सेट करें।
  • यदि आप प्रमाणपत्र को "सिस्टम" किचेन में संग्रहीत नहीं कर सकते हैं, तो इसे "लॉगिन" किचेन में बनाएं, फिर इसे निर्यात करें। फिर आप इसे "सिस्टम" किचेन में आयात कर सकते हैं।
  • किचेन में "सिस्टम" का चयन करें, और आपको अपना नया प्रमाणपत्र ढूंढना चाहिए। प्रमाण पत्र के लिए संदर्भ मेनू का उपयोग करें, "जानकारी प्राप्त करें" का चयन करें, "ट्रस्ट" आइटम खोलें, और "कोड साइनिंग" को "ट्रस्ट ट्रस्ट" पर सेट करें।
  • प्रमाण पत्र का उपयोग करने के लिए आपको "किचेन एक्सेस" एप्लिकेशन को छोड़ना होगा और चालू "टास्कगेटेड" प्रक्रिया को मारकर "टास्कगेटेड" सेवा को फिर से शुरू करना होगा। वैकल्पिक रूप से आप अपने कंप्यूटर को पुनरारंभ कर सकते हैं।
  • अंत में आप जीडीबी पर हस्ताक्षर कर सकते हैं:

    sudo codesign -s gdb-cert /usr/local/bin/ggdb

    sudo ggdb ./myprog


4
नोट हत्या को टास्क किया गया था प्रक्रिया को पुनरारंभ नहीं किया। इसके लिए आवश्यक: सुडोकू लॉंचल लोड / सिस्टम
बेन

उपर्युक्त कार्य फिर से शुरू हुआ - लेकिन यह अभी भी सियरा पर एक रिबूट के बिना काम नहीं किया, दुख की बात है।
नील मैकगिल

16

समस्या यह है कि आप एक रूट उपयोगकर्ता (जो आप नहीं चाहते हैं) के रूप में लॉग इन नहीं होते हैं। आपको एक्सेस की अनुमति के लिए gdb के लिए एक प्रमाण पत्र बनाने की आवश्यकता है। इस ट्यूटोरियल का अनुसरण करें और आपको जाना अच्छा होना चाहिए ...

http://sourceware.org/gdb/wiki/BuildingOnDarwin

यदि बाकी सब विफल रहता है, तो बस उपयोग करें: sudo gdb executableFileName


4
यहाँ ट्यूटोरियल ट्यूटोरियल सबसे अच्छा काम किया। बस ऐप codesign -s gdb-cert $(which gdb)को साइन करने के लिए दौड़ना था gdb
केवरिस

OSX 10.12.5 पर इसे आज़माने वाले किसी के लिए भी, आपको बिल्डिंगऑनलाइन लिंक में उल्लिखित चरणों का पालन करना होगा और रूट उपयोक्ता को स्विच करने के बाद gdb चलाना होगा।
AdjunctProfurerFalcon

7

यह लिंक मेरे लिए इस त्रुटि को गायब करने के लिए सबसे स्पष्ट और सबसे विस्तृत चरण-दर-चरण था।

मेरे मामले में मेरे पास "सिस्टम" कुंजी के रूप में कुंजी होनी चाहिए अन्यथा यह काम नहीं किया (जो हर यूआरएल का उल्लेख नहीं है)।

हत्या taskgatedभी एक व्यवहार्य (और तेज) को पुनः आरंभ करने का विकल्प है।

मैंने इस प्रक्रिया को शुरू करने से पहले MacPorts की स्थापना रद्द कर दी और वर्तमान gdb का उपयोग करके स्थापना रद्द कर दी brew uninstall gdb


इसने मेरे लिए काम किया। संदर्भ के लिए +1 जो उपयोग करता है brew
ट्रिकोमन

3

मुझे एल कैपिटन पर काम करने के लिए इस कमांड की आवश्यकता थी:

sudo security add-trust -d -r trustRoot -p basic -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/gdb-cert.cer

2

मैंने इस ट्यूटोरियल का अनुसरण किया , और सब कुछ ठीक है।


2

MacOSX पर lldb को कोड पर हस्ताक्षर करने की आवश्यकता होती है। डीबग और रिलीज़ बिल्ड एक कोड हस्ताक्षर प्रमाण पत्र का उपयोग करके कोड साइन पर सेट किए जाते हैं जिसका नाम lldb_codesign है।

If you don't have one yet you will need to:
- Launch /Applications/Utilities/Keychain Access.app

- In Keychain Access select the "login" keychain in the "Keychains"
  list in the upper left hand corner of the window.

- Select the following menu item:

    Keychain Access->Certificate Assistant->Create a Certificate...

- Set the following settings

    Name = lldb_codesign
    Identity Type = Self Signed Root
    Certificate Type = Code Signing

- Click Continue
- Click Continue
- Click Done
- Click on the "My Certificates"
- Double click on your new lldb_codesign certificate
- Turn down the "Trust" disclosure triangle

    Change:
        When using this certificate: Always Trust

- Enter your login password to confirm and make it trusted

The next steps are necessary on SnowLeopard, but are probably because of a bug
how Keychain Access makes certificates.

- Option-drag the new lldb_codesign certificate from the login keychain to
  the System keychain in the Keychains pane of the main Keychain Access window
  to make a copy of this certificate in the System keychain.  You'll have to
  authorize a few more times, set it to be "Always trusted" when asked.
- Switch to the System keychain, and drag the copy of lldb_codesign you just
  made there onto the desktop.
- Switch to Terminal, and run the following:

sudo security add-trust -d -r trustRoot -p basic -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/lldb_codesign.cer

- Right click on the "lldb_codesign" certificate in the "System" keychain (NOT
  "login", but the one in "System"), and select "Delete" to delete it from
  the "System" keychain.
- Reboot
- Clean and rebuild lldb and you should be able to debug.

That should do it.

[नोट: - lldb का उपयोग मैक में gdb के रूप में किया जाता है।]


2

यहाँ एक बहुत ही उपयोगी मार्गदर्शिका है जिसने मेरी समस्या (OSX 10.13.6) को हल कर दिया है।

  1. किचेन एक्सेस खोलें
  2. मेनू में, चाबी का गुच्छा एक्सेस> प्रमाणपत्र सहायक खोलें> एक ​​प्रमाण पत्र बनाएं
  3. इसे एक नाम दें (उदा gdbc)
    • पहचान का प्रकार: स्व हस्ताक्षरित जड़
    • प्रमाणपत्र प्रकार: कोड हस्ताक्षर
    • जाँच करें: मुझे डिफ़ॉल्ट को ओवरराइड करने दें
  4. तब तक जारी रखें जब तक कि यह आपके लिए संकेत न दे: "के लिए एक स्थान निर्दिष्ट करें ..."
  5. सिस्टम पर किचेन स्थान सेट करें
  6. एक प्रमाण पत्र और सहायक बनाएँ।
  7. सिस्टम किचेन में प्रमाण पत्र प्राप्त करें, इसे राइट क्लिक करें> जानकारी प्राप्त करें (या बस इसे डबल क्लिक करें)
  8. ट्रस्ट का विस्तार करें, कोड कोड पर हमेशा भरोसा रखें
  9. टर्मिनल में टास्क को फिर से शुरू किया गया: हत्यारे को टास्क दिया गया
  10. codesign -fs gdbc /usr/local/bin/gdbटर्मिनल में चलाएं : यह रूट पासवर्ड पूछता है

1

ये निर्देश OSX हाई सिएरा के लिए काम करते हैं और रूट (yuck!) के रूप में gdb चलाने से बचते हैं। मैंने हाल ही में OSX 10.13.2 से 10.3.3 तक अपडेट किया है। मुझे लगता है कि यह तब है जब gdb 8.0.1 (स्थापित w / होमब्रेव) मेरे लिए असफल होना शुरू हुआ।

मुझे अन्य लोगों के निर्देशों से कठिनाई हुई। अलग-अलग निर्देशों के बाद, सब कुछ गड़बड़ था। इसलिए मैंने एक नई शुरुआत की। मैंने कमोबेश इन निर्देशों का पालन किया

गंदगी साफ करें:

  1. brew uninstall --force gdb # This deletes _all_ versions of gdb on the machine
  2. में Applications-> Utilities-> Keychain Access, मैंने पिछले सभी gdb प्रमाणपत्रों और कुंजियों को हटा दिया (सुनिश्चित करें कि आप जानते हैं कि आप यहाँ क्या कर रहे हैं!)। यदि यह आवश्यक है तो यह स्पष्ट नहीं है, लेकिन जब से मैंने उन प्रमाणपत्रों और कुंजियों को बनाने की कोशिश की है, अन्य निर्देशों का उपयोग करके मैंने उन्हें वैसे भी समाप्त कर दिया। मेरे पास लॉगिन और सिस्टम दोनों में चाबियाँ और प्रमाण पत्र थे।

अब gdb को पुनर्स्थापित करें।

  1. brew install gdb
  2. भीतर Keychain Access, मेनू पर जाएँ Keychain Access-> Certificate Assistant->Create a Certificate
  3. "मुझे डिफ़ॉल्ट को ओवरराइड करने दें" और सेट की जाँच करें
Name : gdb-cert
Identity Type: Self Signed Root
Certificate Type : Code Signing

[X] Let me override defaults
  1. 1 प्रमाणपत्र सूचना पृष्ठ पर:
Serial Number : 1
Validity Period (days): 3650
  1. 2 सर्टिफिकेट इंफॉर्मेशन पेज पर, मैंने पहले से भरे हुए लोगों को छोड़कर सभी फील्ड खाली छोड़ दिए।

  2. मुख्य जोड़ी सूचना पृष्ठ पर, मैंने चूक को छोड़ दिया

Key Size : 2048
Algorithm : RSA
  1. मुख्य उपयोग एक्सटेंशन पृष्ठ पर, मैंने जाँच की गई चूक को छोड़ दिया।
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. विस्तारित कुंजी उपयोग एक्सटेंशन पृष्ठ पर, मैंने जाँच की गई चूक को छोड़ दिया।
[X] Include Extended Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Code Signing
  1. मूल अवरोध एक्सटेंशन पृष्ठ पर, कुछ भी चेक नहीं किया गया (डिफ़ॉल्ट)।

  2. विषय वैकल्पिक नाम एक्सटेंशन पृष्ठ पर, मैंने डिफ़ॉल्ट चेक को छोड़ दिया और कुछ और नहीं जोड़ा।

[X] Include Subject Alternate Name Extension
  1. प्रमाणपत्र पृष्ठ के लिए कोई स्थान निर्दिष्ट करें, मैं सेट करता हूँ
Keychain: System
  1. मैंने क्रिएट पर क्लिक किया और मेरे पासवर्ड के लिए कहा गया।

  2. Keychain Accessऐप में वापस , मैं गया Systemऔर राइट-क्लिक किया gdb-certऔर ड्रॉपडाउन मेनू के तहत Trust, मैंने सभी फ़ील्ड को बदल दिया Always Trust

  3. कंप्यूटर को रिबूट किया।

  4. टर्मिनल पर, मैं भाग गया codesign -s gdb-cert /usr/local/bin/gdb। संकेत मिलने पर मैंने अपना पासवर्ड दर्ज किया।

  5. टर्मिनल पर, मैं भाग गया echo "set startup-with-shell off" >> ~/.gdbinit

  6. मैं भाग गया gdb myprogramऔर फिर startजीडीबी कंसोल के भीतर। यहाँ, मुझे विश्वास है, इसने मेरे पासवर्ड के लिए मुझे संकेत दिया। उसके बाद, बाद के सभी रन, यह मेरे पासवर्ड के लिए संकेत नहीं करता था।


अफसोस की बात है, मैंने शीर्ष-मतदान और आपका उत्तर दोनों दिया, और अभी भी एक ही त्रुटि संदेश देखते हैं। मेरे पास macOS Catalina Version 10.15.4 है, और gdb 9.1 है।
जय सुलिवन

@ जयसलाईवन १। मेरी भी यही समस्या है।
आईरिस

1

यह एक अजीब दृष्टिकोण है लेकिन इसने मेरे लिए काम किया (MacOs HighSierra 10.13.3)। CLION स्थापित करें। यह gdb के साथ आता है। एक बार टर्मिनल का उपयोग करके जीडीबी चलाएं। Gdb प्रोग्राम को अपने usr / लोकल / बिन / पर कॉपी करें। साइनइन, सुडो आदि की कोई समस्या नहीं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.