gdb ล้มเหลวด้วยข้อผิดพลาด“ ไม่พบพอร์ตงาน Mach สำหรับ process-id” ข้อผิดพลาด


138

แอปของฉันทำงานได้ดี แต่ gdb ไม่สามารถดีบักได้ด้วยข้อผิดพลาดต่อไปนี้

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

ฉันใช้ OS X Lion รุ่น 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/
Codie CodeMonkey

คำตอบ:


64

ใน Snow Leopard และ Mac OS เวอร์ชันที่ใหม่กว่านั้นไม่เพียงพอที่จะกำหนดรหัสgdbไฟล์ที่สามารถเรียกทำงานได้

คุณต้องปฏิบัติตามคู่มือนี้เพื่อให้ใช้งานได้: http://www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

คำแนะนำจะอธิบายวิธีการทำเช่นนั้นlldbแต่กระบวนการนั้นเหมือนกันgdbทุกประการ


12
คำแนะนำเหล่านั้นใช้ไม่ได้กับฉันใน OSX 10.9.2 กับ MacPorts แต่สิ่งนี้ทำได้: sourceware.org/gdb/wiki/BuildingOnDarwin
simpleuser

มันได้ผล! แต่คุณช่วยอธิบายsudo security add-trustหน่อยได้ไหมว่าบรรทัดกำลังทำอะไร ฉันสามารถลบ.cerไฟล์ออกจากเดสก์ท็อปของฉันได้ไหม
Sreejith Ramakrishnan

9
codesign -s gdb_codesign `which gdb` ช่วยหลังจากคำแนะนำนี้
synther

หรือsudo codesign -s gdb_codesign `which gdb-apple` บน macOS sierra
sdive

3
สำหรับระบบปฏิบัติการล่าสุดลิงก์ ทำงาน
yuxuan

144

มันทำงานได้เมื่อฉันเปลี่ยนเป็นsudo gdb executableFileName! :)


2
ขอบคุณ การบวกรหัสนี้จำเป็นต้องมีเพื่อให้ gdb ทำงานได้ ฉันให้สิทธิ์การเข้าถึงรูท gdb (ตามที่อธิบายไว้ที่นี่stackoverflow.com/questions/10476154/ … ) ดังนั้นฉันจึงไม่ต้องพิมพ์ sudo ทุกครั้ง แก้ไข - พบวิธีที่ดีกว่าที่นี่: stackoverflow.com/a/10441587/305149
Aneil Mallavarapu

14
เรียกใช้เป็นรากหรือไม่ คุณจริงจังไหม "ทางออก" ที่เลวร้ายที่สุด
Equidamoid

7
@Equidamoid ทำไมมันไม่ดีที่จะทำงานgdbในฐานะ root? ฉันแค่อยากรู้อยากเห็นเพราะเป็นเพียงนักดีบั๊ก
นี้ต้องการความช่วยเหลือ

จะเกิดอะไรขึ้นถ้าคุณเรียกใช้ในฐานะรูท เป็นรหัสที่คุณเขียนและฉันไม่เข้าใจผลที่ตามมา
COLD ICE

4
@COLDICE โดยทั่วไปคุณไม่ต้องการเรียกใช้โปรเซสที่มีสิทธิ์การเลื่อนระดับ (โดยเฉพาะการเลื่อนระดับเป็นรูท) เนื่องจากโดยทั่วไปพวกเขาไม่ต้องการเข้าถึงเพื่อแก้ไขสิ่งต่าง ๆ ในระบบหรือพอร์ตที่เปิดต่ำกว่า 1024 (พอร์ตที่สูงกว่าอาจเป็น ใช้โดยผู้ใช้ที่ไม่ใช่ระบบ / ไม่ใช่ผู้ใช้รูท) แม้ว่าคุณจะ "เชื่อใจ" รหัสของคุณเองก็ไม่ได้หมายความว่าคุณไม่ได้ทำผิดพลาดซึ่งเป็นสาเหตุให้เกิดความเสียหายrm -rf /หรือสิ่งที่คุณเขียนทับการตั้งค่า / ไบนารี่ที่คอมพิวเตอร์ของคุณใช้นั้นเริ่มต้นขึ้นและทำงานได้ตามปกติ
shaunhusain

32

คุณต้องสร้างใบรับรองและลงชื่อ gdb:

  • เปิดแอปพลิเคชั่น“ Keychain Access” (/ Applications / Utilities / Keychain Access.app)
  • เปิดเมนู / การเข้าถึงพวงกุญแจ / ผู้ช่วยใบรับรอง / สร้างใบรับรอง ...
  • เลือกชื่อ (gdb-cert ในตัวอย่าง) ตั้งค่า“ ประเภทข้อมูลประจำตัว” เป็น“ รูตแบบลงนามด้วยตนเอง” ตั้งค่า“ ประเภทใบรับรอง” เป็น“ การลงนามรหัส” และเลือก“ ให้ฉันแทนที่ค่าเริ่มต้น” คลิก“ ดำเนินการต่อ” คุณอาจต้องการขยายระยะเวลา 365 วันที่กำหนดไว้ล่วงหน้าเป็น 3650 วัน
  • คลิกหลาย ๆ ครั้งที่ "ดำเนินการต่อ" จนกว่าคุณจะไปที่หน้าจอ "ระบุที่ตั้งสำหรับใบรับรอง" จากนั้นตั้งค่า "Keychain to System"
  • หากคุณไม่สามารถเก็บใบรับรองในพวงกุญแจ "ระบบ" ให้สร้างในพวงกุญแจ "เข้าสู่ระบบ" จากนั้นส่งออก จากนั้นคุณสามารถนำเข้าสู่พวงกุญแจ“ ระบบ”
  • ในพวงกุญแจเลือก "ระบบ" และคุณควรหาใบรับรองใหม่ของคุณ ใช้เมนูบริบทสำหรับใบรับรองเลือก "รับข้อมูล" เปิดรายการ "เชื่อถือ" และตั้งค่า "การเซ็นรหัส" เป็น "เชื่อถือได้เสมอ"
  • คุณต้องออกจากแอปพลิเคชัน "การเข้าถึงพวงกุญแจ" เพื่อที่จะใช้ใบรับรองและเริ่มบริการ "taskgated" ใหม่โดยการฆ่ากระบวนการ "taskgated" ที่กำลังทำงานอยู่ หรือคุณสามารถรีสตาร์ทคอมพิวเตอร์
  • ในที่สุดคุณสามารถลงชื่อ gdb:

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

    sudo ggdb ./myprog


4
taskgated note kill ไม่ได้รีสตาร์ทกระบวนการ ต้องการ: sudo launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist
Ben

taskgated ดังกล่าวข้างต้นรีสตาร์ท - แต่ก็ยังไม่ทำงานโดยไม่ต้องรีบูตบนเซียร่าเศร้า
Neil McGill

16

ปัญหาคือคุณไม่ได้เข้าสู่ระบบในฐานะผู้ใช้รูท (ซึ่งคุณไม่ต้องการ) คุณต้องสร้างใบรับรองเพื่อให้ gdb สามารถเข้าถึงได้ ทำตามบทช่วยสอนนี้แล้วคุณน่าจะไป ...

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

หากสิ่งอื่นล้มเหลวเพียงแค่ใช้: sudo gdb executableFileName


4
บทช่วยสอนที่นี่ทำงานได้ดีที่สุด เพียงแค่ต้องเรียกใช้codesign -s gdb-cert $(which gdb)เพื่อเซ็นชื่อgdbแอพ
cevaris

เพียงยืนยันว่าใครก็ตามที่ลองสิ่งนี้ใน OSX 10.12.5 คุณต้องทำตามขั้นตอนที่อธิบายไว้ในลิงก์ BuildingOnDarwin และเรียกใช้ gdb หลังจากเปลี่ยนเป็นผู้ใช้รูท
AdjunctProfessorFalcon

7

ลิงก์นี้มีรายละเอียดทีละขั้นตอนชัดเจนที่สุดและละเอียดที่สุดเพื่อทำให้ข้อผิดพลาดนี้หายไปสำหรับฉัน

ในกรณีของฉันฉันต้องมีคีย์เป็นคีย์ "ระบบ" มิฉะนั้นจะใช้งานไม่ได้ (ซึ่งไม่ใช่ทุก URL ที่กล่าวถึง)

การฆ่าtaskgatedก็เป็นทางเลือก (และเร็วกว่า) ในการรีสตาร์ท

ฉันยังถอนการติดตั้ง MacPortsก่อนที่ผมจะเริ่มต้นกระบวนการนี้และถอนการติดตั้ง gdb brew uninstall gdbปัจจุบันใช้


สิ่งนี้ใช้ได้สำหรับฉัน +1 brewสำหรับการอ้างอิงที่ใช้
trigoman

3

ฉันต้องการคำสั่งนี้เพื่อให้ทำงานกับ El Capitan:

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


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 ใน mac เป็น gdb]


2

นี่คือคำแนะนำที่เป็นประโยชน์จริง ๆซึ่งแก้ไขปัญหาของฉัน (OSX 10.13.6)

  1. เปิดการเข้าถึง Keychain
  2. ในเมนูเปิดการเข้าถึง Keychain> ผู้ช่วยใบรับรอง> สร้างใบรับรอง
  3. ตั้งชื่อ (เช่น gdbc)
    • ประเภทตัวตน: รูตที่ลงชื่อด้วยตนเอง
    • ประเภทใบรับรอง: การเซ็นรหัส
    • ตรวจสอบ: ให้ฉันแทนที่ค่าเริ่มต้น
  4. ดำเนินการต่อจนกว่าจะพร้อมท์ให้คุณ: "ระบุตำแหน่งสำหรับ ... "
  5. ตั้งค่าตำแหน่งพวงกุญแจเป็นระบบ
  6. สร้างใบรับรองและผู้ช่วยใกล้ชิด
  7. ค้นหาใบรับรองในระบบพวงกุญแจคลิกขวา> รับข้อมูล (หรือคลิกสองครั้ง)
  8. ขยายความเชื่อถือตั้งค่าการเซ็นชื่อรหัสให้เชื่อถือได้เสมอ
  9. รีสตาร์ท taskgated ใน terminal: killall taskgated
  10. รันcodesign -fs gdbc /usr/local/bin/gdbในเทอร์มินัล: สิ่งนี้จะถามรหัสผ่านรูท

1

คำแนะนำเหล่านี้ใช้ได้กับ OSX High Sierra และหลีกเลี่ยงการเรียกใช้ gdb ในฐานะ root (yuck!) ฉันเพิ่งอัปเดตจาก OSX 10.13.2 เป็น 10.3.3 ฉันคิดว่านี่เป็นเมื่อ gdb 8.0.1 (ติดตั้งกับ homebrew) เริ่มล้มเหลวสำหรับฉัน

ฉันมีปัญหากับคำแนะนำของคนอื่น หลังจากคำแนะนำที่แตกต่างกันทุกอย่างเป็นระเบียบ ดังนั้นฉันจึงเริ่มต้นใหม่ ฉันทำตามคำแนะนำเหล่านี้มากหรือน้อยคำแนะนำ

ทำความสะอาดเป็นระเบียบ:

  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. ในหน้าข้อมูลคีย์คู่ฉันออกจากค่าเริ่มต้น

Key Size : 2048
Algorithm : RSA
  1. ในหน้าส่วนขยายการใช้คีย์ฉันออกจากค่าเริ่มต้นที่เลือกไว้
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. ในหน้า Extended Key Usage Extension ฉันออกจากค่าเริ่มต้นที่เลือกไว้
[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และภายใต้เมนูแบบเลื่อนลงผมเปลี่ยนทุกสาขาเพื่อTrustAlways Trust

  3. รีบูทคอมพิวเตอร์

  4. codesign -s gdb-cert /usr/local/bin/gdbที่เทอร์มิฉันวิ่ง ฉันป้อนรหัสผ่านเมื่อได้รับแจ้ง

  5. ฉันวิ่งไปที่เทอร์มินัล echo "set startup-with-shell off" >> ~/.gdbinit

  6. ฉันวิ่งgdb myprogramแล้วstartภายในคอนโซล gdb ที่นี่ฉันเชื่อว่ามันจะขอรหัสผ่านของฉัน หลังจากนั้นการเรียกใช้ทั้งหมดที่ตามมาจะไม่พร้อมท์รหัสผ่านของฉัน


น่าเศร้าที่ฉันทำทั้งคำตอบที่ได้รับคะแนนสูงสุดและคำตอบของคุณและยังเห็นข้อความแสดงข้อผิดพลาดเดียวกัน ฉันมี macOS Catalina เวอร์ชั่น 10.15.4 และ gdb 9.1
Jay Sullivan

@JaySullivan +1 ฉันมีปัญหาเดียวกัน
irsis

1

นี่เป็นวิธีที่แปลก แต่ใช้งานได้สำหรับฉัน (MacOs HighSierra 10.13.3) ติดตั้ง CLion มันมาพร้อมกับ gdb เมื่อรัน gdb โดยใช้ Terminal คัดลอกโปรแกรม gdb ไปยัง usr / local / bin / ของคุณ ไม่มีปัญหาของการลงชื่อเข้าใช้ sudo ฯลฯ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.