gdb, "işlem kimliği için Mach görev bağlantı noktası bulunamadı" hatasıyla başarısız oluyor


138

Uygulamam düzgün çalışıyor ancak gdb aşağıdaki hata ile hata ayıklamıyor

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

OS X Lion'dayım. GDB sürümü

$ 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".

Bence bu yazı yardımcı olabilir: stackoverflow.com/questions/10221448/… .
Codie CodeMonkey

Yanıtlar:


64

Snow Leopard ve sonraki Mac OS sürümlerinde, gdbyürütülebilir dosyayı kodlamak yeterli değildir .

Çalışması için bu kılavuzu izlemeniz gerekir: http://www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

Kılavuz, bunun nasıl yapılacağını açıklar lldb, ancak süreç tam olarak aynıdır gdb.


12
Bu talimatlar MacPorts ile OSX 10.9.2 benim için çalışmalarını yoktu, ama bu yaptı: sourceware.org/gdb/wiki/BuildingOnDarwin
simpleuser

İşe yarıyor! Ama lütfen sudo security add-trusthattın ne yaptığını açıklayabilir misiniz ? .cerDosyayı şimdi masaüstümden silebilir miyim ?
Sreejith Ramakrishnan

9
codesign -s gdb_codesign `which gdb` bu kılavuzdan sonra yardımcı olur
synther

Veya sudo codesign -s gdb_codesign `which gdb-apple` macOS sierra'te.
sdive

3
En son işletim sistemi için bağlantı çalıştı
yuxuan

144

Ben değiştiğinde çalışır sudo gdb executableFileName! :)


2
Teşekkürler. Gdb'nin çalışması için bu artı kodu imzalanması gerekiyordu. Gdb root erişimi verdim (burada açıklandığı gibi stackoverflow.com/questions/10476154/… ) bu yüzden her seferinde sudo yazmak zorunda kalmadım. Düzenleme - Burada daha iyi bir yaklaşım bulundu: stackoverflow.com/a/10441587/305149
Aneil Mallavarapu

14
Kök olarak çalıştırılsın mı? Ciddi misin? En kötü "çözüm".
Equidamoid

7
@Equidamoid Neden gdbroot olarak çalıştırmak bu kadar kötü olur ? Merak ettim çünkü bu sadece bir hata ayıklayıcı.
BU KULLANICI,

Kök olarak çalıştırırsanız ne olur? Bu yazdığın kod, ve ben sonuçlarını anlamıyorum
SOĞUK ICE

4
@COLDICE genel olarak, yükseltilmiş ayrıcalıklara sahip işlemleri (özellikle kök olarak en üste yükseltilir) çalıştırmak istemezsiniz, çünkü genel olarak sistemdeki şeyleri veya 1024'ten daha düşük açık bağlantı noktalarını değiştirmek için erişime ihtiyaç duymazlar (daha yüksek bağlantı noktaları olabilir) sistem dışı / kök olmayan kullanıcılar tarafından kullanılır). Kendi kodunuza "güveniyorsanız" bile, bunun neden olduğu bir hata yapmadığınız rm -rf /veya bilgisayarınızın normal şekilde başlatılması ve çalıştırılması için güvendiği bazı yapılandırmaların / ikili dosyaların üzerine yazdığınızda benzer şekilde yıkıcı bir şey yapmadığınız anlamına gelmez .
shaunhusain

32

Bir sertifika oluşturmanız ve gdb'yi imzalamanız gerekir:

  • Açık uygulama “Keychain Access” (/ Uygulamalar / Yardımcı Programlar / Keychain Access.app)
  • Menüyü aç / Anahtarlık Erişimi / Sertifika Yardımcısı / Sertifika Oluştur ...
  • Bir ad seçin (örnekte 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. “Devam” a tıklayın. Önceden tanımlanmış 365 günlük süreyi 3650 güne uzatmak isteyebilirsiniz.
  • “Sertifika İçin Bir Konum Belirtin” ekranına gelene kadar “Devam” üzerine birkaç kez tıklayın, ardından “Sistem için Anahtarlık” ayarını yapın.
  • Sertifikayı “Sistem” anahtarlığında saklayamıyorsanız, “giriş” anahtarlığında oluşturun ve ardından dışa aktarın. Daha sonra "Sistem" anahtarlığına alabilirsiniz.
  • Anahtarlıklarda “Sistem” i seçin, yeni sertifikanızı bulmalısınız. Sertifika için bağlam menüsünü kullanın, “Bilgi Al” ı seçin, “Güven” öğesini açın ve “Kod İmzalama” yı “Her Zaman Güven” olarak ayarlayın.
  • Sertifikayı kullanabilmek için “Keychain Access” uygulamasından çıkmanız ve şu anda çalışan “taskgated” işlemini öldürerek “taskgated” hizmetini yeniden başlatmanız gerekir. Alternatif olarak bilgisayarınızı yeniden başlatabilirsiniz.
  • Sonunda gdb'yi imzalayabilirsiniz:

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

    sudo ggdb ./myprog


4
note kill killgated işlemi yeniden başlatmadı. gereken: sudo launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist
Ben

Yukarıdaki görev yeniden başlatıldı - ama yine de ne yazık ki Sierra'da yeniden başlatmadan işe yaramadı.
Neil McGill

16

Sorun, kök kullanıcı olarak (istemediğiniz) oturum açmamış olmanızdır. GDB'nin erişime izin vermesi için bir sertifika oluşturmanız gerekir. Bu öğreticiyi takip edin ve gitmek için iyi olmalısınız ...

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

Her şey başarısız olursa, sadece şunu kullanın: sudo gdb executableFileName


4
Burada ilnked öğretici en iyi çalıştı. Sadece uygulamayı codesign -s gdb-cert $(which gdb)imzalamak için çalıştırmak zorunda kaldı gdb.
cevaris

Sadece OSX 10.12.5'te bunu deneyen herkes için onaylamak, hem BuildingOnDarwin bağlantısında özetlenen adımları izlemeniz VE kök kullanıcıya geçtikten sonra gdb'yi çalıştırmanız gerekir.
AdjunctProfessorFalcon

7

Bu bağlantı , bu hatayı benim için ortadan kaldırmak için en açık ve en ayrıntılı adım adım sahipti.

Benim durumumda bir "Sistem" anahtarı olarak anahtar olması gerekiyordu aksi takdirde işe yaramadı (her url söz değil).

Öldürmek aynı zamanda taskgatedyeniden başlatmaya uygun (ve daha hızlı) bir alternatiftir.

Bu işleme başlamadan önce MacPorts'u da kaldırdım ve geçerli gdb'yi kullanarak kaldırdım brew uninstall gdb.


Bu benim için çalıştı. Kullanan başvuru için +1 brew.
trigoman

3

El Capitan'da çalışması için bu komuta ihtiyacım vardı:

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


2

MacOSX'da lldb'nin kod imzalı olması gerekir. Hata Ayıklama ve Sürüm yapıları, lldb_codesign adlı bir kod imzalama sertifikası kullanılarak kod işaretine ayarlanır.

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.

[Not: - lldb mac'ta gdb olarak kullanılır.]


2

İşte sorunumu çözen gerçekten kullanışlı bir rehber (OSX 10.13.6).

  1. Açık Anahtarlık Erişimi
  2. Menüde Anahtar Zinciri Erişimi> Sertifika Yardımcısı> Sertifika oluştur'u açın
  3. Bir ad verin (örn. Gdbc)
    • Kimlik türü: Kendinden İmzalı Kök
    • Sertifika türü: Kod İmzalama
    • Kontrol et: varsayılanları geçersiz kılmama izin ver
  4. Sizden şunu isteyene kadar devam edin: "... için bir konum belirtin"
  5. Anahtarlık konumunu Sistem olarak ayarlayın
  6. Bir sertifika oluşturun ve asistanı kapatın.
  7. Sertifikayı Sistem anahtarlıklarında bulun, sağ tıklayın> bilgi edinin (veya sadece çift tıklayın)
  8. Güven'i genişletin, Kod imzalamayı her zaman güvenilecek şekilde ayarlayın
  9. Terminalde yeniden görevlendirme: killall görev
  10. codesign -fs gdbc /usr/local/bin/gdbTerminalde çalıştır : bu root şifresini ister

1

Bu talimatlar OSX High Sierra için çalışır ve gdb'yi root (yuck!) Olarak çalıştırmaktan kaçınır. Kısa süre önce OSX 10.13.2'den 10.3.3'e güncelledim. Bu gdb 8.0.1 (w / homebrew yüklü) benim için başarısız başladığında olduğunu düşünüyorum.

Başkalarının talimatları ile güçlük çektim. Farklı talimatlardan sonra, her şey bir karışıklıktı. Bu yüzden bir taze başladı. Bu talimatları az çok izledim .

Dağınıklığı temizleyin:

  1. brew uninstall --force gdb # This deletes _all_ versions of gdb on the machine
  2. In Applications-> Utilities-> Keychain AccessBen tüm önceki gdb sertifikaları ve anahtarları silindi (emin sen burada ne yaptığını biliyorum olmak!). Bunun gerekli olup olmadığı belli değil, ancak diğer sertifikaları kullanarak bu sertifikaları ve anahtarları oluşturmayı denediğim için onları yine de ortadan kaldırdım. Hem giriş hem de sistem anahtarları ve sertifikaları vardı.

Şimdi gdb'yi yeniden yükleyin.

  1. brew install gdb
  2. İçinde Keychain Access, menüye gidin Keychain Access-> Certificate Assistant->Create a Certificate
  3. "Varsayılanları geçersiz kılmama izin ver" i işaretleyin ve
Name : gdb-cert
Identity Type: Self Signed Root
Certificate Type : Code Signing

[X] Let me override defaults
  1. 1. Sertifika Bilgileri sayfasında:
Serial Number : 1
Validity Period (days): 3650
  1. 2. Sertifika Bilgileri sayfasında, önceden doldurulmuş olanlar dışındaki tüm alanları boş bıraktım.

  2. Anahtar Çifti Bilgileri sayfasında varsayılanları bıraktım

Key Size : 2048
Algorithm : RSA
  1. Anahtar Kullanım Uzantısı sayfasında, varsayılanları işaretli olarak bıraktım.
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. Genişletilmiş Anahtar Kullanımı Uzantısı sayfasında, varsayılanları işaretli olarak bıraktım.
[X] Include Extended Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Code Signing
  1. Temel Sınırlamalar Uzantı Sayfasında hiçbir şey işaretlenmedi (varsayılan).

  2. Konu Diğer Adı Uzantısı sayfasında, varsayılanı işaretli bıraktım ve başka bir şey eklemedim.

[X] Include Subject Alternate Name Extension
  1. Sertifika sayfası için bir konum belirtin
Keychain: System
  1. Oluştur'u tıkladım ve şifremi girmem istendi.

  2. Keychain AccessUygulamaya geri döndüm Systemve sağ tıkladım gdb-certve açılır menü altında Trust, tüm alanları olarak değiştirdim Always Trust.

  3. Bilgisayar yeniden başlatıldı.

  4. Terminalde koştum codesign -s gdb-cert /usr/local/bin/gdb. İstendiğinde şifremi girdim.

  5. Terminalde koştum echo "set startup-with-shell off" >> ~/.gdbinit

  6. gdb myprogramSonra startgdb konsolunda koştum . Burada inanıyorum, şifremi girmemi istedi. Bundan sonra, sonraki tüm çalışır, şifremi sormadı.


Ne yazık ki, en çok oy alan yanıtı ve cevabınızı aldım ve yine de aynı hata mesajını görüyorum. MacOS Catalina Sürüm 10.15.4 ve gdb 9.1 sürümüne sahibim.
Jay Sullivan

@JaySullivan +1. Aynı problemim var.
irsis

1

Bu garip bir yaklaşım ama benim için çalıştı (MacOs HighSierra 10.13.3). CLion'u yükleyin. GDB ile geliyor. Bir kez Terminal kullanarak gdb çalıştırın. Gdb programını usr / local / bin / dizinine kopyalayın. İmzalama, sudo vs. sorunu yok.


1

Buradaki talimatları izleyerek macOS'taki Codesign gdb, benim için macOS High Sierra'da (10.13.3) bu sorunu çözdü.

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.