“ โปรดตรวจสอบว่า gdb is codeigned - ดูที่ taskgated (8)” - จะติดตั้ง gdb ด้วยการลงนามรหัส homebrew ได้อย่างไร?


109

ฉันใช้ osx 10.8.4 และได้ติดตั้ง gdb 7.5.1 ด้วย homebrew (แรงจูงใจในการรับ gdb ใหม่พร้อมคุณสมบัติใหม่เช่น - พร้อม - python ฯลฯ ... )

เรื่องสั้นสั้นเมื่อฉันเรียกใช้ debug ภายในโครงการ c ++ Eclipse ฉันได้รับ:

Error in final launch sequence
Failed to execute MI command:
-exec-run
Error message from debugger back end:
Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))
Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))

ฉันได้ทำตามคำแนะนำต่างๆสำหรับการเซ็นรหัส

ดังนั้นฉันจึง:

  1. ตั้งค่าใบรับรอง
  2. ลงชื่อ gdb - >codeign -s gdb-cert / usr / local / bin / gdb

เมื่อฉันรันการดีบักอีกครั้งใน Eclipse ฉันได้รับข้อผิดพลาดเดียวกันกับด้านบน "(โปรดตรวจสอบว่า gdb มีการลงรหัส - ดูที่ taskgated (8))"

ถ้าฉันตั้งค่า gdb กลับเป็น gdb ที่เก่ากว่า (ในการตั้งค่า gdb ของ Eclipse) / usr / libexec / gdb / gdb-i386-apple-darwin การดีบักจะทำงานตามที่คาดไว้

วิธีแก้ปัญหา / คำแนะนำใด ๆ

ขอบคุณ

เพล


นี่ไม่ใช่ "คุณลักษณะความปลอดภัย" กล่าวคือระบบของคุณได้รับการกำหนดค่าให้ยอมรับเฉพาะซอฟต์แวร์ที่ได้รับการลงนามอย่างเป็นทางการหรือไม่? ถ้าเป็นเช่นนั้นหวังว่าจะมีวิธีปิดฟีเจอร์นั้น ...
Mats Petersson

โอเคขอบคุณสำหรับความคิดเห็นของคุณ - ฉันเข้าใจจุดคุณสมบัติความปลอดภัยของคุณ แต่ปัญหาของฉันคือวิธีการเซ็นชื่อ ... มีโพสต์ที่คล้ายกันstackoverflow.com/questions/12050257/gdb-fails-on-mountain-lionซึ่งไม่ได้ ' ยังแก้ให้ฉัน
pellekrogholt

คำตอบ:


139

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจาก OSX ใช้นโยบายการเข้าถึง pid ซึ่งต้องใช้ลายเซ็นดิจิทัลสำหรับไบนารีเพื่อเข้าถึง pids กระบวนการอื่น ๆ ในการเปิดใช้งานการเข้าถึง gdb ไปยังกระบวนการอื่น ๆ เราต้องลงรหัสไบนารีก่อน ลายเซ็นนี้ขึ้นอยู่กับใบรับรองเฉพาะซึ่งผู้ใช้ต้องสร้างและลงทะเบียนกับระบบ

ในการสร้างใบรับรองการเซ็นชื่อรหัสให้เปิดแอปพลิเคชัน Keychain Access เลือกเมนูการเข้าถึงพวงกุญแจ -> ผู้ช่วยใบรับรอง -> สร้างใบรับรอง ...

เลือกชื่อสำหรับใบรับรอง (เช่น gdb-cert) ตั้งค่า Identity Type เป็น Self Signed Root ตั้งค่า Certificate Type เป็น Code Signing และเลือก Let me override default คลิกหลาย ๆ ครั้งบนดำเนินการต่อจนกว่าคุณจะไปที่หน้าจอระบุตำแหน่งสำหรับใบรับรองจากนั้นตั้งค่าพวงกุญแจเป็นระบบ

ดับเบิลคลิกที่ใบรับรองเปิดส่วน Trust และตั้งค่า Code Signing เป็น Always Trust ออกจากแอปพลิเคชัน Keychain Access

เริ่มบริการที่กำหนดไว้ใหม่และลงชื่อไบนารี

$ sudo killall taskgated
$ codesign -fs gdb-cert "$(which gdb)"

แหล่งที่มาhttp://andresabino.com/2015/04/14/codesign-gdb-on-mac-os-x-yosemite-10-10-2/

บน macOS 10.12 (Sierra) และใหม่กว่าคุณต้องทำเช่นกัน

ใช้ gdb 7.12.1 หรือใหม่กว่านอกจากนี้ยังป้องกันไม่ให้ gdb ใช้เชลล์เพื่อเริ่มโปรแกรมที่จะดีบัก คุณสามารถใช้คำสั่งต่อไปนี้สำหรับสิ่งนี้ภายใน gdb:

set startup-with-shell off

คุณยังสามารถใส่คำสั่งสุดท้ายนี้ในไฟล์ชื่อ. gdbinit ในโฮมไดเร็กทอรีของคุณซึ่งในกรณีนี้จะถูกนำไปใช้โดยอัตโนมัติทุกครั้งที่คุณเริ่ม gdb

echo "set startup-with-shell off" >> ~/.gdbinit

แหล่งที่มา: https://sourceware.org/gdb/wiki/BuildingOnDarwin


6
ใช้งานได้เหมือนมีเสน่ห์ ขอบคุณ.
pceccon

14
ตามที่ OP ชี้ให้เห็นสิ่งนี้ไม่ได้ทำเพื่อเขา (และสำหรับฉันก็ไม่ได้ทำเช่นกัน)
PVitt

6
ดูเหมือนว่าจะใช้ไม่ได้macOS Sierraกับใบรับรองที่ลงนามด้วยตนเอง
loretoparisi

sudo killall taskgatedเป็นกุญแจสำคัญในการแก้ปัญหาของฉัน
Karthikeyan Vaithilingam

ฉันทำตามขั้นตอนอย่างแม่นยำและสิ่งนี้ใช้ได้ผลกับฉันบน macOS Sierra
jdg

29

ฉันอัปเกรดเป็นgdb 8.3และไม่สามารถทำให้สิ่งต่างๆใช้งานได้ สิ่งนี้ช่วยฉัน:

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb

เนื้อหาอยู่ที่ไหนgdb.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <key>com.apple.security.cs.allow-dyld-environment-variables</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
    <key>com.apple.security.cs.disable-executable-page-protection</key>
    <true/>
    <key>com.apple.security.cs.debugger</key>
    <true/>
    <key>com.apple.security.get-task-allow</key>
    <true/>
</dict>
</plist>

ฉันพบวิธีแก้ปัญหานี้ที่นี่: https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

หมายเหตุ: โดยไม่ต้องมีสิทธิก็สามารถที่จะเรียกใช้เฉพาะกับgdbsudo


2
คุณจะทำอย่างไรถ้าคุณได้รับerror: The specified item could not be found in the keychain.
Sridhar Sarnobat

@SridharSarnobat ใช้ไปป์ไลน์ก่อนของคำตอบนี้stackoverflow.com/a/32727069/339146
Panayotis

ล้มเหลวหลังจากลองคำตอบของ @maximser แล้วสิ่งนี้ใช้ได้กับฉัน macOS 10.15.4, gdb 9.2 ติดตั้งผ่านการชง
weaming

@SridharSarnobat: คุณต้องสร้างใบรับรองก่อนstackoverflow.com/questions/35020236/…
Akansha

ดูเหมือนว่าเราต้องทำซ้ำคำสั่งนี้ทุกครั้งที่สร้างใหม่
user5735224

29

ฉันทำให้ gdb ทำงานบน OSX 10.9 โดยไม่มีการออกแบบโค้ดด้วยวิธีนี้ (อธิบายที่นี่ ):

  1. ติดตั้ง gdb กับ macports (อาจจะข้ามไปก็ได้)

  2. sudo nano /System/Library/LaunchDaemons/com.apple.taskgated.plist

    เปลี่ยนตัวเลือกสตริงจาก-sเป็น-spบรรทัด 22, col 27

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

  4. ใช้ gdb หากคุณติดตั้งด้วยพอร์ต mac คุณต้องใช้ggdbคำสั่ง หรือสร้างนามแฝงในไฟล์กำหนดค่าของคุณ:

alias gdb='ggdb'

และใช้คำสั่ง 'gdb' จากนั้น


ฉันพบปัญหานี้มาระยะหนึ่งแล้วและพบว่าวิธีการอื่น ๆ ไม่เป็นประโยชน์ สิ่งนี้ได้ผลเหมือนมีเสน่ห์
Bill DeRose

@BillDeRose เหมือนกันสำหรับฉัน
klm123

@nimrodm คุณหมายถึง "sudo gdb"? ควรเป็น "ggdb" กับ macports
klm123

1
ฮึ. ฉันไม่ต้องการให้มีการทำงานเป็นgdb sudoดูเหมือนว่าเป็นความเสี่ยงด้านความปลอดภัยที่ไม่จำเป็น
Juno Woods

2
ไม่ได้ไปรีสตาร์ทคอมพิวเตอร์ ต้องมีคำสั่งเพื่อรีสตาร์ทบางสิ่ง!
Michael

26

ฉันประสบปัญหาเดียวกันกับ GDB ฉันกำลังวิ่งอยู่ใต้Mac OS X 10.8.5สิงโตภูเขา 7.7.1ฉันกำลังใช้รุ่น GDB

ฉันรวบรวมโปรแกรมทดสอบของฉันด้วยคำสั่งต่อไปนี้:

g++ -o gdb-sample.out -g gdb-sample.cpp    

หากฉันป้อนคำสั่งgdb sample.outฉันจะได้รับข้อความแสดงข้อผิดพลาดที่เป็นความลับเดียวกัน:

"Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))"

ข้อความแสดงข้อผิดพลาดนี้เป็นปลาชนิดหนึ่งสีแดง

วิธีแก้ปัญหาที่ฉันพบว่าใช้ได้ผลสำหรับฉันคือเพียงแค่เรียกใช้ GDB โดยใช้ superuser acct:

sudo gdb sample.out. 

มันใช้ได้ดีสำหรับฉัน

และจากจุดนั้นฉันสามารถเรียกใช้ GDB example.out ได้โดยไม่ต้องใช้ sudo

หวังว่านี่จะช่วยและใช้ได้ผลกับคนอื่น ๆ ตอบกลับถ้าไม่


1
ไม่แน่ใจว่าเหตุใดจึงโหวตไม่ลง ฉันรันคำสั่งในฐานะรูท (ด้วย sudo) และใช้งานได้
iProgram

7

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

  1. สร้างใบรับรองเพื่อลงนามใน gdb

ขออภัยใบรับรองระบบให้ฉัน Unknown Error = -2,147,414,007ซึ่งมีประโยชน์มากดังนั้นฉันจึงต้องแก้ปัญหาชั่วคราว KeyChain Assistant -> Create certificate ->

เลือก login , gdb-cert,Code Signing

คัดลอก / ย้ายใบรับรองไปที่พวงกุญแจระบบ (ป้อนรหัสผ่าน)

  1. เลือกใบรับรอง (gdb-cert ) คลิกGet info->Trust Always
  2. ปิดการใช้งาน startup-with-shell

เข้าสู่คอนโซล: set startup-with-shell off

จำการกำหนดค่า: echo "set startup-with-shell off" >> ~/. gdbinit

  1. เปิดใช้งานผู้ใช้รูท

ไปที่System Preferences-> Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it-> Edit(เมนู) ->Enable Root User

  1. sudo killall taskgated
  2. สุดท้ายลงชื่อ gdb

codesign -fs gdb-cert "$(which gdb)"

  1. ปิดการใช้งานผู้ใช้รูท (ขั้นตอนที่ 4)
  2. รีบูตหากยังไม่ทำงาน (ถ้าไม่มีอะไรใช้งานได้ส่วนใหญ่จะใช้งานได้แล้ว)

ปล. ฉันใช้lldbเพราะมันใช้งานได้ ( บทช่วยสอน )


5

สำหรับใครก็ตามที่ใช้ Sierra 10.12.6 (ขึ้นไป) และ Homebrew /usr/local/bin/gdbเป็นลิงก์สัญลักษณ์ไปยัง/usr/local/Cellar/gdb/8.0/bin/gdb(หรือเวอร์ชันใดก็ได้เช่น8.0.1 )

คุณต้องเขียนโค้ดทั้งลิงก์และกำหนดเป้าหมาย:

codesign -fs gdb-cert /usr/local/bin/gdb
codesign -fs gdb-cert "/usr/local/Cellar/gdb/8.0/bin/gdb"

หรือถ้าคุณมี greadlink (ติดตั้งผ่านbrew install coreutils):

codesign -fs gdb-cert $(which gdb)
codesign -fs gdb-cert $(greadlink -f $(which gdb))

1
คุณลองสิ่งนี้กับ High Sierra หรือไม่? มันไม่ได้ผลสำหรับฉันใน O / S: 10.13.6
rustyMagnet

3

ฉันสงสัยว่าการเปลี่ยนแปลงทั่วโลกในคำตอบที่ได้รับการโหวตสูงสุดที่นี่หรือไม่ได้มีผลที่ไม่คาดคิดหรือไม่

แทนที่จะเปิดใช้งานการประชุม Tiger แบบเก่า taskgated จะอนุญาตให้รันโค้ดที่เซ็นชื่อ ดังนั้นมันอาจจะดีกว่าที่จะได้รับใบรับรองที่ลงนามสำหรับ gdb คล้ายกับคำตอบที่นี่คำตอบที่นี่

หลังจากนี้ฉันสามารถsudoใช้ gdb หากคุณต้องการใช้ gdb w / o sudo บางทีลิงก์นี้อาจช่วยได้แต่ฉันยังไม่ได้ลองใช้เพราะตอนsudoนี้การใช้เป็นวิธีแก้ปัญหาที่โอเค


3

เรื่องนี้อาจไม่เกี่ยวข้องกัน คุณใช้ lldb บน macos แทน gdb ได้ คุณไม่จำเป็นต้องยุ่งยากในการติดตั้ง gdb

lldb ( http://lldb.llvm.org ) ได้รับการติดตั้งแล้วโดยค่าเริ่มต้นใน High Sierra


0

ฉันสามารถแนะนำให้ทำตามส่วนสำคัญนี้: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

เคล็ดลับเอาชนะ: unknown error = -2,147,414,007ระหว่างการสร้างใบรับรองอธิบายไว้ที่นี่: https://apple.stackexchange.com/a/309123

หมายเหตุ:

เส้นทางสำหรับ gdb ติดตั้งเป็น homebrewแพ็คเกจควรเป็นดังนี้:/usr/local/Cellar/gdb/9.2/bin/gdb

และcsrutil enable --without debugจะทำให้เกิดข้อความเกี่ยวกับrequesting unsupported configurationเช่นที่นี่: https://totalfinder.binaryage.com/system-integrity-protection

ทดสอบ:

  sw_vers -productVersion
10.13.6

  gdb ./a.out
GNU gdb (GDB) 9.2
...
Thread 3 hit Breakpoint 1, main () at main.c:14
14          data_t d = {0};

-1

กทม 8.3;

ปัญหาของฉันเหมือนกับผู้ชายข้างต้นแก้ไขได้โดย

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