"Lütfen gdb'nin kod imzalanıp imzalanmadığını kontrol edin - bkz. Taskgated (8)" - Homebrew kodu imzalanmış olarak gdb nasıl kurulur?


107

Osx 10.8.4 altındayım ve homebrew ile gdb 7.5.1 yükledim (motivasyon --with-python vb. Gibi yeni özelliklerle yeni bir gdb edinin ...)

Uzun lafın kısası, bir c ++ Eclipse projesinde hata ayıklamayı çalıştırdığımda şunu elde ederim:

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

Kod imzalama için çeşitli önerileri takip ettim

Ben de yaptım:

  1. Sertifikayı ayarlayın
  2. Gdb -> codeign -s gdb-cert / usr / local / bin / gdb'yi imzalayın

Eclipse'de hata ayıklamayı yeniden çalıştırdığımda, yukarıdaki ile aynı hatayı alıyorum "(lütfen gdb'nin kod imzalı olup olmadığını kontrol edin - bkz. Taskgated (8))".

Eğer gdb'yi eski gdb'ye (Eclipse'nin gdb tercihlerinde) / usr / libexec / gdb / gdb-i386-apple-darwin'e ayarlarsam, hata ayıklama beklendiği gibi çalışır.

Herhangi bir çözüm / ipucu var mı?

Teşekkürler

Pelle


Bu bir "güvenlik özelliği" değil midir - başka bir deyişle, sisteminiz yalnızca resmi olarak imzalanmış yazılımları kabul edecek şekilde yapılandırılmış mı? Öyleyse, umarım bu özelliği kapatmanın bir yolu vardır ...
Mats Petersson

tamam geri bildiriminiz için teşekkürler - güvenlik özelliği noktanızı anlıyorum ama benim sorunum imzalamanın nasıl yapılacağı ... benzer bir post stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion var henüz benim için
çöz

Yanıtlar:


137

Bu hata, OSX'in diğer işlem pid'lerine erişmesi için ikili dosyalar için dijital imza gerektiren bir pid erişim ilkesi uyguladığı için oluşur. Diğer işlemlere gdb erişimini etkinleştirmek için, önce ikili kodu imzalamalıyız. Bu imza, kullanıcının oluşturması ve sisteme kaydolması gereken belirli bir sertifikaya bağlıdır.

Bir kod imzalama sertifikası oluşturmak için Anahtar Zinciri Erişimi uygulamasını açın. Anahtar Zinciri Erişimi -> Sertifika Yardımcısı -> Sertifika Oluştur… menüsünü seçin.

Sertifika için bir ad seçin (örneğin, gdb-cert), Kimlik Türünü Kendinden İmzalı Kök olarak ayarlayın, Sertifika Türünü Kod İmzalama olarak ayarlayın ve Varsayılanları geçersiz kılmama izin ver'i seçin. Sertifika İçin Bir Konum Belirtin ekranına gelene kadar Devam'a birkaç kez tıklayın, ardından Anahtar Zinciri'ni Sistem olarak ayarlayın.

Sertifikaya çift tıklayın, Güven bölümünü açın ve Kod İmzalama'yı Her Zaman Güven olarak ayarlayın. Anahtar Zinciri Erişimi uygulamasından çıkın.

Göreve bağlı hizmeti yeniden başlatın ve ikili dosyayı imzalayın.

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

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

MacOS 10.12 (Sierra) ve sonraki sürümlerde ayrıca

Gdb 7.12.1 veya sonraki sürümünü kullanın Ek olarak, gdb'nin hata ayıklanacak programı başlatmak için bir kabuk kullanmasını önleyin. Bunun için gdb içerisinde aşağıdaki komutu kullanabilirsiniz:

set startup-with-shell off

Bu son komutu, ana dizininizdeki .gdbinit adlı bir dosyaya da koyabilirsiniz, bu durumda gdb'yi her başlattığınızda otomatik olarak uygulanacaktır.

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

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


6
Tıkır tıkır çalışıyor. Teşekkür ederim.
pceccon

14
OP'nin işaret ettiği gibi, bu onun için işe yaramadı (ve benim için de değil).
PVitt

6
macOS SierraKendinden imzalı sertifikalarla çalışmıyor gibi görünüyor .
loretoparisi

sudo killall taskgatedsorunumu çözmenin anahtarı
Karthikeyan Vaithilingam

Adımları tam olarak takip ettim ve bu, macOS Sierra'da benim için çok güzel çalıştı.
jdg

29

Gdb'yi OSX 10.9'da bu şekilde kod imzalamadan çalıştırdım ( burada açıklanmıştır ):

  1. Gdb'yi macports ile yükleyin. (belki atlayabilirsin)

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

    dan seçenek dizesini değiştirmek -siçin -sphat 22 col 27 at.

  3. Bilgisayarı yeniden başlat.

  4. Gdb kullanın. Mac bağlantı noktaları ile kurduysanız, ggdbkomut kullanmanız gerekir . Veya yapılandırma dosyanızda bir takma ad oluşturun:

alias gdb='ggdb'

ve 'gdb' komutunu kullanın.


Bir süredir bu sorunla karşılaşıyordum ve diğer nasıl yapılır yöntemlerini yararsız bulmuştum. Bu harika çalıştı.
Bill DeRose

@BillDeRose, benim için aynı.
klm123

@nimrodm, "sudo gdb" mi demek istiyorsun? macports ile "ggdb" olmalıdır
klm123

1
Ugh. gdbOlarak koşmak zorunda kalmak istemiyorum sudo. Bu gereksiz bir güvenlik riski gibi görünüyor.
Autumnsault

2
Bilgisayarı yeniden başlatmayacak. Bir şeyi yeniden başlatmak için bir komut olmalı!
Michael

27

Yeni sürüme geçtim gdb 8.3ve işlerin yürümesini sağlayamadım. Bu bana yardımcı oldu:

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

İçeriği 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>

Bu çözümü burada buldum: https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

Not: Yetki olmadan gdbsadece ile çalışabildim sudo.


2
error: The specified item could not be found in the keychain.
Olursa

@SridharSarnobat Bu cevabın ilk olarak pipeline'ı kullanın stackoverflow.com/a/32727069/339146
Panayotis

@Maximser yanıtını denedikten sonra başarısız oldu. O zaman bu benim için çalışıyor. macOS 10.15.4, gdb 9.2, brew aracılığıyla yüklenir.
weaming

@SridharSarnobat: Sertifika İlk oluşturmak zorunda stackoverflow.com/questions/35020236/...
Akansha

26

GDB ile aynı sorunu yaşadım. Mac OS X 10.8.5Dağ Aslanı altında koşuyorum . GDB sürümünü kullanıyorum 7.7.1.

Test programımı aşağıdaki komutla derledim:

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

Komutu girdiysem, gdb sample.outaynı şifreli hata mesajını alıyorum:

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

Ancak bu hata mesajı kırmızı ringa balığıdır.

Benim için işe yarayan bulduğum çözüm, süper kullanıcı hesabını kullanarak GDB'yi basitçe çağırmaktı:

sudo gdb sample.out. 

Bu benim için iyi çalışıyor.

Ve bu noktadan itibaren GDB example.out'u sudo kullanmadan çalıştırabilirim.

Umarım bu yardımcı olur ve başkaları için çalışır. RSVP, yoksa.


1
Bunun neden reddedildiğinden emin değilim. Komutu root olarak (sudo ile) çalıştırdım ve işe yaradı.
iProgram

6

Bunların hiçbiri benim için işe yaramadı ve uzun bir koşu yapmak zorunda kaldım. İşte onu çalıştırmak için yaptığım adımların tam listesi.

  1. Gdb'yi imzalamak için bir sertifika oluşturun.

Ne yazık ki, sistem sertifikası bana Unknown Error = -2,147,414,007çok yardımcı oldu, bu yüzden bir geçici çözüm bulmam gerekti. KeyChain Assistant -> Create certificate ->

Seç login,gdb-cert ,Code Signing

Sertifikayı Sistem anahtar zincirine kopyalayın / taşıyın (şifre girin)

  1. Sertifikayı seçin ( gdb-cert) tıklayın Get info->Trust Always
  2. Devre dışı bırak startup-with-shell

Konsola girin: set startup-with-shell off

Yapılandırmayı hatırla: echo "set startup-with-shell off" >> ~/. gdbinit

  1. Kök Kullanıcıyı Etkinleştir

Git System Preferences-> Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it-> Edit(menü) ->Enable Root User

  1. sudo killall taskgated
  2. Sonunda gdb'yi imzalayın

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

  1. Kök Kullanıcıyı Devre Dışı Bırak (Adım 4)
  2. Hala çalışmıyorsa yeniden başlatın. (başka hiçbir şey işe yaramazsa, büyük olasılıkla zaten çalışıyor)

PS. Kullanmaya başladım lldbçünkü işe yarıyor ( öğretici )


5

Sierra 10.12.6 (ve üstü) ve Homebrew kullanan herkes /usr/local/bin/gdbiçin sembolik bir bağlantıdır /usr/local/Cellar/gdb/8.0/bin/gdb(veya herhangi bir sürüm, örn.8.0.1 ).

Hem bağlantıyı hem de hedefi kodlamanız gerekir:

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

Veya, greadlink(üzerinden yüklediyseniz brew install coreutils):

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

1
bunu High Sierra'da denedin mi? Benim için O / S: 10.13.6
rustyMagnet

3

Merak ediyorum, buradaki en yüksek oyu alan cevaptaki küresel değişikliğin bazı istenmeyen sonuçları olup olmadığını merak ediyorum .

Taskgated, eski Tiger kuralını etkinleştirmek yerine imzalı kodun çalışmasına izin verir. Bu nedenle, buradaki yanıta benzer şekilde gdb için imzalı bir sertifika almak daha iyi olabilir .

Bundan sonra sudogdb'yi kullanabildim. Eğer gdb w / o sudo kullanmanız gerekiyorsa, o zaman belki bu bağlantı yardımcı olacaktır , feragatname, henüz denemedim çünkü kullanmak sudoşimdilik iyi bir çözümdür`.


3

Bu ilgili olmayabilir. Macos üzerinde gdb yerine lldb kullanabilirsiniz. Gdb'yi kurmak için bu zahmete ihtiyacınız yok.

lldb ( http://lldb.llvm.org ), High Sierra'da varsayılan olarak zaten yüklüdür


0

Bu ana fikri takip etmenizi tavsiye edebilirim: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

Üstesinden gelinmesi gereken bir numara: unknown error = -2,147,414,007Sertifika Oluşturma sırasında burada açıklanan: https://apple.stackexchange.com/a/309123

Notlar:

homebrewPaket olarak kurulan gdb yolu aşağıdaki gibi olmalıdır:/usr/local/Cellar/gdb/9.2/bin/gdb

Ve burada olduğu gibi csrutil enable --without debugbir mesaja neden olur requesting unsupported configuration: https://totalfinder.binaryage.com/system-integrity-protection

Ölçek:

  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

gdb 8.3;

Benim sorunum yukarıdaki adamla aynı,

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.