“Tolong periksa gdb is codesigned - lihat taskgated (8)” - Bagaimana cara menginstal gdb dengan kode homebrew ditandatangani?

107

Saya menggunakan osx 10.8.4 dan telah menginstal gdb 7.5.1 dengan homebrew (motivasi mendapatkan gdb baru dengan fitur baru seperti --with-python dll ...)

Singkat cerita ketika saya menjalankan debug dalam proyek c ++ Eclipse saya mendapatkan:

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))

Saya telah mengikuti berbagai saran untuk penandatanganan kode

Jadi saya melakukan:

  1. Siapkan sertifikat
  2. Masuk gdb -> kode tanda -s gdb-cert / usr / local / bin / gdb

Ketika saya menjalankan kembali debugging di Eclipse, saya mendapatkan kesalahan yang sama seperti di atas "(periksa gdb adalah kode yang ditandatangani - lihat taskgated (8))".

Jika saya menyetel kembali gdb ke gdb yang lebih lama (dalam preferensi gdb dari Eclipse) / usr / libexec / gdb / gdb-i386-apple-darwin proses debug berjalan seperti yang diharapkan.

Ada solusi / petunjuk di luar sana?

Terima kasih

Pelle

pellekrogholt
sumber
Apakah ini bukan "fitur keamanan" - dengan kata lain, sistem Anda dikonfigurasi untuk hanya menerima perangkat lunak yang telah ditandatangani secara resmi? Jika demikian, semoga ada cara untuk mematikan fitur itu ...
Mats Petersson
ok terima kasih atas tanggapan Anda - saya mengerti poin fitur keamanan Anda tetapi masalah saya adalah bagaimana melakukan penandatanganan ... ada posting serupa stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion yang tidak ' Saya belum menyelesaikannya untuk saya
pellekrogholt

Jawaban:

136

Kesalahan ini terjadi karena OSX mengimplementasikan kebijakan akses pid yang memerlukan tanda tangan digital untuk biner untuk mengakses pids proses lainnya. Untuk mengaktifkan akses gdb ke proses lain, pertama-tama kita harus menandatangani kode biner. Tanda tangan ini bergantung pada sertifikat tertentu, yang harus dibuat dan didaftarkan oleh pengguna ke sistem.

Untuk membuat sertifikat penandatanganan kode, buka aplikasi Keychain Access. Pilih menu Keychain Access -> Certificate Assistant -> Create a Certificate…

Pilih nama untuk sertifikat (mis., Gdb-cert), setel Jenis Identitas ke Akar yang Ditandatangani Sendiri, setel Jenis Sertifikat ke Penandatanganan Kode dan pilih Biarkan saya mengganti default. Klik beberapa kali Lanjutkan hingga Anda masuk ke layar Tentukan Lokasi Untuk Sertifikat, lalu atur Rantai Kunci ke Sistem.

Klik dua kali pada sertifikat, buka bagian Kepercayaan, dan atur Penandatanganan Kode ke Selalu Percayai. Keluar dari aplikasi Keychain Access.

Mulai ulang layanan taskgated, dan tanda tangani biner.

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

sumber http://andresabino.com/2015/04/14/codesign-gdb-on-mac-os-x-yosemite-10-10-2/

Di macOS 10.12 (Sierra) dan versi lebih baru, Anda juga harus melakukannya

Gunakan gdb 7.12.1 atau yang lebih baru Selain itu, cegah gdb menggunakan shell untuk memulai program yang akan di-debug. Anda dapat menggunakan perintah berikut untuk ini di dalam gdb:

set startup-with-shell off

Anda juga dapat meletakkan perintah terakhir ini dalam file bernama .gdbinit di direktori home Anda, dalam hal ini perintah akan diterapkan secara otomatis setiap kali Anda memulai gdb

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

SUMBER: https://sourceware.org/gdb/wiki/BuildingOnDarwin

maximser
sumber
6
Bekerja seperti pesona. Terima kasih.
pceccon
14
Seperti yang ditunjukkan OP, ini tidak berhasil baginya (dan juga untuk saya).
PVitt
6
Tampaknya ini tidak berfungsi macOS Sierradengan sertifikat yang ditandatangani sendiri.
loretoparisi
sudo killall taskgatedadalah kunci untuk memecahkan masalah saya
Karthikeyan Vaithilingam
Saya mengikuti langkah-langkahnya dengan tepat, dan ini bekerja dengan baik untuk saya di macOS Sierra.
jdg
29

Saya membuat gdb berfungsi di OSX 10.9 tanpa kode yang ditandatangani seperti ini (dijelaskan di sini ):

  1. Instal gdb dengan macports. (mungkin Anda bisa melewatkannya)

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

    Ubah string opsi dari -smenjadi -sppada baris 22, kolom 27.

  3. Nyalakan ulang komputer.

  4. Gunakan gdb. Jika Anda menginstalnya dengan port mac maka Anda harus menggunakan ggdbperintah. Atau buat alias di file konfigurasi Anda:

alias gdb='ggdb'

dan gunakan perintah 'gdb'.

klm123
sumber
Saya telah mengalami masalah ini untuk sementara waktu dan menemukan cara-cara lain tidak membantu. Ini bekerja seperti pesona.
Bill DeRose
@BillDeRose, sama untuk saya.
klm123
@nimrodm, maksud Anda "sudo gdb"? seharusnya "ggdb" dengan macports
klm123
1
Ugh. Saya tidak ingin lari gdbsebagai sudo. Sepertinya risiko keamanan yang tidak diperlukan.
Autumnsault
2
Tidak akan me-restart komputer. Harus ada perintah untuk memulai kembali sesuatu!
Michael
27

Saya meningkatkan ke gdb 8.3dan tidak dapat membuat semuanya berfungsi. Ini membantu saya:

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

Dimana isinya gdb.xmladalah:

<?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>

Saya menemukan solusi ini di sini: https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

Catatan: Tanpa hak saya hanya bisa menjalankan gdbdengan sudo.

Johnny Thunderman
sumber
2
Apa yang Anda lakukan jika Anda mendapatkanerror: The specified item could not be found in the keychain.
Sridhar Sarnobat
@SridharSarnobat Gunakan saluran pertama dari jawaban ini stackoverflow.com/a/32727069/339146
Panayotis
Gagal setelah mencoba jawaban @maximser. Maka ini berhasil untuk saya. macOS 10.15.4, gdb 9.2 diinstal melalui brew.
Weaming
@SridharSarnobat: Anda harus membuat sertifikat terlebih dahulu stackoverflow.com/questions/35020236/…
Akansha
26

Saya mengalami masalah yang sama dengan GDB. Saya berlari di bawah Mac OS X 10.8.5alias Mountain Lion. Saya menggunakan versi GDB 7.7.1.

Saya menyusun program pengujian saya dengan perintah berikut:

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

Jika saya memasukkan perintah gdb sample.out, saya mendapatkan pesan kesalahan samar yang sama:

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

Namun pesan kesalahan ini adalah red herring.

Solusi yang saya temukan yang berhasil bagi saya adalah dengan memanggil GDB menggunakan akun superuser:

sudo gdb sample.out. 

Itu bekerja dengan baik untuk saya.

Dan sejak saat itu saya bisa menjalankan GDB example.out tanpa menggunakan sudo.

Semoga ini membantu dan berhasil untuk orang lain. RSVP jika tidak.

mickster99
sumber
1
Tidak yakin mengapa ini ditolak. Saya menjalankan perintah sebagai root (dengan sudo) dan berhasil.
iProgram
6

Tak satu pun dari ini berhasil untuk saya dan saya harus pergi dengan jangka panjang. Berikut adalah daftar lengkap langkah-langkah yang telah saya lakukan untuk membuatnya berfungsi.

  1. Buat sertifikat untuk menandatangani gdb.

Sayangnya, sertifikat sistem memberi saya Unknown Error = -2,147,414,007 yang sangat membantu, jadi saya harus mencari solusi. KeyChain Assistant -> Create certificate ->

Pilih login,gdb-cert ,Code Signing

Salin / pindahkan sertifikat ke rantai kunci Sistem (masukkan kata sandi)

  1. Pilih sertifikat ( gdb-cert) klik Get info->Trust Always
  2. Nonaktifkan startup-with-shell

Masuk di konsol: set startup-with-shell off

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

  1. Aktifkan Pengguna Root

Pergi ke System Preferences-> Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it-> Edit(menu) ->Enable Root User

  1. sudo killall taskgated
  2. Terakhir, tandatangani gdb

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

  1. Nonaktifkan Pengguna Root (Langkah 4)
  2. Reboot jika masih tidak berhasil. (jika tidak ada yang berhasil, kemungkinan besar sudah berfungsi)

PS. Saya akhirnya menggunakan lldbkarena itu hanya berfungsi ( tutorial )

Taras Matsyk
sumber
5

Bagi siapa saja yang menggunakan Sierra 10.12.6 (dan di atasnya) dan Homebrew, /usr/local/bin/gdbini adalah tautan simbolis ke /usr/local/Cellar/gdb/8.0/bin/gdb(atau versi apa pun, mis.8.0.1 ).

Anda perlu memberi kode pada tautan dan target:

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

Atau, jika Anda telah greadlink(menginstal melalui brew install coreutils):

codesign -fs gdb-cert $(which gdb)
codesign -fs gdb-cert $(greadlink -f $(which gdb))
Larry Song
sumber
1
apakah kamu mencoba ini di High Sierra? Itu tidak berhasil untuk saya di O / S: 10.13.6
rustyMagnet
3

Saya bertanya-tanya apakah perubahan global dalam jawaban dengan suara terbanyak di sini memiliki beberapa konsekuensi yang tidak diinginkan.

Daripada mengaktifkan konvensi Tiger lama, taskgated memungkinkan kode yang ditandatangani untuk dijalankan. Jadi mungkin lebih baik untuk mendapatkan sertifikat yang ditandatangani untuk gdb, mirip dengan jawabannya di sini .

Setelah ini saya bisa sudomenggunakan gdb. Jika Anda perlu menggunakan gdb w / o sudo maka mungkin tautan ini akan membantu , disclaimer, saya belum mencobanya karena menggunakan sudoadalah solusi yang ok untuk saat ini`.

JnBrymn
sumber
3

Ini mungkin tidak berhubungan. Anda dapat menggunakan lldb di macos sebagai ganti gdb. Anda tidak perlu repot untuk menginstal gdb.

lldb ( http://lldb.llvm.org ) sudah diinstal secara default di High Sierra

Kaituo Li
sumber
0

Saya dapat merekomendasikan untuk mengikuti inti ini: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

Dengan trik untuk mengatasi: unknown error = -2,147,414,007selama Pembuatan Sertifikat dijelaskan di sini: https://apple.stackexchange.com/a/309123

Catatan:

Path untuk gdb yang diinstal sebagai homebrewpaket harus seperti ini:/usr/local/Cellar/gdb/9.2/bin/gdb

Dan csrutil enable --without debugakan menimbulkan pesan tentang requesting unsupported configuration, seperti di sini: https://totalfinder.binaryage.com/system-integrity-protection

Uji:

  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};
Iurii Vasylenko
sumber
-1

gdb 8.3;

Masalah saya sama dengan orang di atas, diselesaikan oleh

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