gdb gagal dengan kesalahan "Tidak dapat menemukan port tugas Mach untuk id proses"

139

Aplikasi saya berjalan dengan baik tetapi gdb gagal melakukan debug dengan kesalahan berikut

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

Saya menggunakan OS X Lion. Versi GDB adalah

$ 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".
SB
sumber
Saya pikir posting ini dapat membantu: stackoverflow.com/questions/10221448/… .
Codie CodeMonkey

Jawaban:

66

Di Snow Leopard dan versi Mac OS yang lebih baru, itu tidak cukup untuk membuat kode yang gdbdapat dieksekusi.

Anda harus mengikuti panduan ini untuk membuatnya berfungsi: http://www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

Panduan ini menjelaskan cara melakukannya lldb, tetapi prosesnya persis sama gdb.

Tyilo
sumber
14
Instruksi tersebut tidak berfungsi untuk saya di OSX 10.9.2 dengan MacPorts, tetapi ini berhasil: sourceware.org/gdb/wiki/BuildingOnDarwin
simpleuser
Berhasil! Tapi bisakah Anda menjelaskan apa yang dilakukan sudo security add-trustsaluran tersebut? Bisakah saya menghapus .cerfile dari desktop saya sekarang?
Sreejith Ramakrishnan
9
codesign -s gdb_codesign `which gdb` membantu setelah panduan ini
synther
Atau sudo codesign -s gdb_codesign `which gdb-apple` di macOS sierra.
sdive
3
Untuk OS terbaru, tautan berfungsi
yuxuan
146

Ini berfungsi saat saya berganti ke sudo gdb executableFileName! :)

Mengyuan
sumber
2
Terima kasih. Penandatanganan kode plus ini diperlukan agar gdb berfungsi. Saya memberikan akses root gdb (seperti yang dijelaskan di sini stackoverflow.com/questions/10476154/… ) jadi saya tidak perlu mengetik sudo setiap kali. Sunting -
Temukan
14
Jalankan sebagai root? Apakah kamu serius? "Solusi" terburuk.
Equidamoid
7
@Equidamoid Mengapa sangat buruk menjalankan gdbsebagai root? Saya hanya ingin tahu karena Ini hanya debugger.
PENGGUNA INI MEMBUTUHKAN BANTUAN
Apa yang akan terjadi jika Anda menjalankannya sebagai root? Itu kode yang Anda tulis, dan saya tidak mengerti konsekuensinya
COLD ICE
4
@COLDICE secara umum Anda tidak ingin menjalankan proses dengan hak istimewa yang ditingkatkan (terutama ditingkatkan ke atas sebagai root) karena secara umum mereka tidak memerlukan akses untuk mengubah hal-hal pada sistem atau membuka port yang lebih rendah dari 1024 (port yang lebih tinggi dapat digunakan oleh pengguna non sistem / non root). Bahkan jika Anda "mempercayai" kode Anda sendiri, itu tidak berarti Anda tidak membuat kesalahan yang menyebabkannya rm -rf /atau sesuatu yang juga merusak di mana Anda menimpa beberapa konfigurasi / binari yang diandalkan komputer Anda untuk memulai dan beroperasi secara normal.
shaunhusain
32

Anda perlu membuat sertifikat dan menandatangani gdb:

  • Buka aplikasi "Akses Keychain" (/ Applications / Utilities / Keychain Access.app)
  • Buka menu / Akses Gantungan Kunci / Asisten Sertifikat / Buat Sertifikat ...
  • Pilih nama (gdb-cert dalam contoh), setel "Identity Type" ke "Self Signed Root", setel "Certificate Type" ke "Code Signing" dan pilih "Let me override defaults". Klik "Lanjutkan". Anda mungkin ingin memperpanjang periode 365 hari yang telah ditentukan menjadi 3650 hari.
  • Klik beberapa kali pada "Lanjutkan" sampai Anda sampai ke layar "Tentukan Lokasi Untuk Sertifikat", lalu setel "Rantai Kunci ke Sistem".
  • Jika Anda tidak dapat menyimpan sertifikat di rantai kunci "Sistem", buatlah di rantai kunci "masuk", lalu ekspor. Anda kemudian dapat mengimpornya ke rantai kunci "Sistem".
  • Di gantungan kunci pilih "Sistem", dan Anda akan menemukan sertifikat baru Anda. Gunakan menu konteks untuk sertifikat, pilih "Dapatkan Info", buka item "Kepercayaan", dan setel "Penandatanganan Kode" ke "Selalu Percayai".
  • Anda harus keluar dari aplikasi "Keychain Access" untuk menggunakan sertifikat dan memulai ulang layanan "taskgated" dengan menghentikan proses "taskgated" yang sedang berjalan. Atau Anda dapat memulai ulang komputer Anda.
  • Akhirnya Anda bisa masuk gdb:

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

    sudo ggdb ./myprog

qed
sumber
4
catatan membunuh taskgated tidak memulai ulang proses. diperlukan untuk: sudo launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist
Ben
Di atas taskgated restart - tetapi masih tidak berfungsi tanpa reboot di sierra, sayangnya.
Neil McGill
16

Masalahnya adalah Anda tidak masuk sebagai pengguna root (yang tidak Anda inginkan). Anda perlu membuat sertifikat untuk gdb agar dapat mengakses. Ikuti tutorial ini dan Anda akan baik-baik saja ...

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

Jika semuanya gagal, cukup gunakan: sudo gdb executableFileName

Sam Ruberti
sumber
4
Tutorial yang ada di sini bekerja paling baik. Hanya harus menjalankan codesign -s gdb-cert $(which gdb)Untuk menandatangani gdbaplikasi.
cevaris
Hanya mengonfirmasi untuk siapa saja yang mencoba ini di OSX 10.12.5, Anda harus mengikuti langkah-langkah yang diuraikan di tautan BuildingOnDarwin DAN menjalankan gdb setelah beralih ke pengguna root.
AdjunctProfessorFalcon
7

Tautan ini memiliki langkah demi langkah yang paling jelas dan terperinci untuk membuat kesalahan ini hilang untuk saya.

Dalam kasus saya, saya harus memiliki kunci sebagai kunci "Sistem" jika tidak maka kunci tersebut tidak berfungsi (yang tidak disebutkan setiap url).

Juga membunuh taskgatedadalah alternatif yang layak (dan lebih cepat) untuk memulai kembali.

Saya juga mencopot MacPorts sebelum saya memulai proses ini dan mencopot pemasangan gdb saat ini menggunakan brew uninstall gdb.

Hans Roggeman
sumber
Ini berhasil untuk saya. 1 untuk referensi yang menggunakan brew.
trigoman
3

Saya membutuhkan perintah ini untuk membuatnya berfungsi di El Capitan:

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

Saya mengikuti tutorial ini , dan semuanya baik-baik saja.

ray6080
sumber
2

Di MacOSX lldb perlu ditandatangani kode. Build Debug dan Rilis disetel ke tanda kode menggunakan sertifikat penandatanganan kode bernama 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.

[Catatan: - lldb digunakan di mac sebagai gdb.]

Bhupesh Pant
sumber
2

Berikut adalah panduan yang sangat berguna yang memecahkan masalah saya (OSX 10.13.6).

  1. Buka Akses Rantai Kunci
  2. Di menu, buka Akses Rantai Kunci> Asisten Sertifikat> Buat sertifikat
  3. Beri nama (misalnya gdbc)
    • Jenis identitas: Self Signed Root
    • Jenis sertifikat: Penandatanganan Kode
    • Periksa: biarkan saya mengganti default
  4. Lanjutkan hingga Anda diminta untuk: "tentukan lokasi untuk ..."
  5. Setel lokasi rantai kunci ke Sistem
  6. Buat sertifikat dan asisten dekat.
  7. Temukan sertifikat di gantungan kunci Sistem, klik kanan> dapatkan info (atau cukup klik dua kali)
  8. Perluas Kepercayaan, setel Penandatanganan kode untuk selalu percaya
  9. Restart taskgated di terminal: killall taskgated
  10. Jalankan codesign -fs gdbc /usr/local/bin/gdbdi terminal: ini meminta kata sandi root
Yihe
sumber
1

Petunjuk ini berfungsi untuk OSX High Sierra dan hindari menjalankan gdb sebagai root (yuck!). Saya baru saja memperbarui dari OSX 10.13.2 ke 10.3.3. Saya pikir ini adalah saat gdb 8.0.1 (diinstal w / homebrew) mulai gagal untuk saya.

Saya mengalami kesulitan dengan instruksi orang lain. Setelah instruksi yang berbeda, semuanya menjadi berantakan. Jadi saya mulai segar. Saya kurang lebih mengikuti instruksi ini .

Bersihkan yang berantakan:

  1. brew uninstall --force gdb # This deletes _all_ versions of gdb on the machine
  2. Di Applications-> Utilities-> Keychain Access, saya menghapus semua sertifikat dan kunci gdb sebelumnya (pastikan Anda tahu apa yang Anda lakukan di sini!). Tidak jelas apakah ini perlu, tetapi karena saya berusaha keras untuk mencoba membuat sertifikat dan kunci tersebut menggunakan instruksi lain, saya tetap menghapusnya. Saya memiliki kunci dan sertifikat di login dan sistem.

Sekarang instal ulang gdb.

  1. brew install gdb
  2. Di dalam Keychain Access, masuk ke menu Keychain Access-> Certificate Assistant->Create a Certificate
  3. Centang "Biarkan saya mengganti default" dan setel
Name : gdb-cert
Identity Type: Self Signed Root
Certificate Type : Code Signing

[X] Let me override defaults
  1. Pada halaman Informasi Sertifikat pertama:
Serial Number : 1
Validity Period (days): 3650
  1. Pada halaman Informasi Sertifikat ke-2, saya membiarkan semua bidang kosong kecuali yang sudah diisi.

  2. Pada halaman Key Pair Information, saya meninggalkan default

Key Size : 2048
Algorithm : RSA
  1. Pada halaman Key Usage Extension, saya membiarkan defaultnya dicentang.
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. Pada halaman Extended Key Usage Extension, saya membiarkan defaultnya dicentang.
[X] Include Extended Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Code Signing
  1. Pada Halaman Ekstensi Kendala Dasar, tidak ada yang diperiksa (default).

  2. Pada halaman Ekstensi Nama Alternatif Subjek, saya membiarkan default dicentang dan tidak menambahkan apa pun.

[X] Include Subject Alternate Name Extension
  1. Pada Tentukan Lokasi untuk halaman sertifikat, saya set
Keychain: System
  1. Saya mengklik Buat dan diminta memasukkan kata sandi saya.

  2. Kembali ke Keychain Accessaplikasi, saya pergi ke Systemdan mengklik kanan pada gdb-certdan di bawah menu dropdown Trust, saya mengubah semua bidang menjadi Always Trust.

  3. Komputer yang di-boot ulang.

  4. Di Terminal, saya lari codesign -s gdb-cert /usr/local/bin/gdb. Saya memasukkan kata sandi saya saat diminta.

  5. Di Terminal, saya lari echo "set startup-with-shell off" >> ~/.gdbinit

  6. Saya berlari gdb myprogramdan kemudian startdi dalam konsol gdb. Di sini, saya yakin, itu meminta kata sandi saya. Setelah itu, semua proses berikutnya, tidak meminta kata sandi saya.

iritasi_phd_syndrom
sumber
Sayangnya, saya melakukan jawaban pilihan teratas dan jawaban Anda, dan masih melihat pesan kesalahan yang sama. Saya memiliki macOS Catalina Versi 10.15.4, dan gdb 9.1.
Jay Sullivan
@JaySullivan +1. Saya juga punya masalah yang sama.
irsis
1

Ini adalah pendekatan yang aneh tetapi berhasil untuk saya (MacOs HighSierra 10.13.3). Pasang CLion. Itu datang dengan gdb. Setelah menjalankan gdb menggunakan Terminal. Salin program gdb ke usr / local / bin / Anda. Tidak ada masalah masuk, sudo dll.

Sparsh Gupta
sumber
1

Mengikuti instruksi di sini Codesign gdb di macOS tampaknya menyelesaikan masalah ini, bagi saya, di macOS High Sierra (10.13.3).

Gino
sumber