“Vui lòng kiểm tra gdb đã được ký mã chưa - xem taskgated (8)” - Làm thế nào để cài đặt gdb với mã homebrew đã ký?


107

Tôi đang sử dụng hệ điều hành osx 10.8.4 và đã cài đặt gdb 7.5.1 với homebrew (động lực để có được một gdb mới với các tính năng mới như --with-python, v.v.)

Một câu chuyện ngắn khi tôi chạy gỡ lỗi trong một dự án Eclipse c ++, tôi nhận được:

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

Tôi đã làm theo các đề xuất khác nhau để ký mã

Tôi cũng vậy:

  1. Thiết lập chứng chỉ
  2. Ký gdb -> ký hiệu mã -s gdb-cert / usr / local / bin / gdb

Khi tôi chạy lại gỡ lỗi trong Eclipse, tôi gặp lỗi tương tự như trên "(vui lòng kiểm tra gdb có được ký mã hay không - xem taskgated (8))".

Nếu tôi đặt lại gdb về gdb cũ hơn (trong tùy chọn gdb của Eclipse) / usr / libexec / gdb / gdb-i386-apple-darwin thì việc gỡ lỗi sẽ chạy như mong đợi.

Có giải pháp / gợi ý nào không?

Cám ơn

Pelle


Đây không phải là một "tính năng bảo mật" - hay nói cách khác, hệ thống của bạn được cấu hình để chỉ chấp nhận phần mềm đã được ký chính thức? Nếu vậy, hy vọng có một cách để biến rằng tính năng tắt ...
Mats Petersson

được rồi, cảm ơn phản hồi của bạn - tôi hiểu điểm tính năng bảo mật của bạn nhưng vấn đề của tôi sau đó là làm thế nào để thực hiện việc ký ... có một bài đăng tương tự stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion mà đã không ' t giải quyết nó cho tôi được nêu ra
pellekrogholt

Câu trả lời:


136

Lỗi này xảy ra do OSX triển khai chính sách truy cập pid yêu cầu chữ ký số cho các tệp nhị phân để truy cập các pid quy trình khác. Để cho phép truy cập gdb vào các quy trình khác, trước tiên chúng ta phải ký mã nhị phân. Chữ ký này phụ thuộc vào một chứng chỉ cụ thể, mà người dùng phải tạo và đăng ký với hệ thống.

Để tạo chứng chỉ ký mã, hãy mở ứng dụng Keychain Access. Chọn menu Truy cập chuỗi khóa -> Hỗ trợ chứng chỉ -> Tạo chứng chỉ…

Chọn tên cho chứng chỉ (ví dụ: gdb-cert), đặt Loại nhận dạng thành Gốc tự ký, đặt Loại chứng chỉ thành Ký mã và chọn mặc định Cho phép tôi ghi đè. Nhấp nhiều lần vào Tiếp tục cho đến khi bạn chuyển đến màn hình Chỉ định vị trí cho chứng chỉ, sau đó đặt Chuỗi khóa thành Hệ thống.

Nhấp đúp vào chứng chỉ, mở phần Tin cậy và đặt Ký mã thành Luôn tin cậy. Thoát khỏi ứng dụng Keychain Access.

Khởi động lại dịch vụ được phân bổ nhiệm vụ và ký vào nhị phân.

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

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

Trên macOS 10.12 (Sierra) trở lên, bạn cũng phải

Sử dụng gdb 7.12.1 trở lên Ngoài ra, ngăn gdb sử dụng trình bao để khởi động chương trình được gỡ lỗi. Bạn có thể sử dụng lệnh sau cho lệnh này bên trong gdb:

set startup-with-shell off

Bạn cũng có thể đặt lệnh cuối cùng này trong tệp có tên .gdbinit trong thư mục chính của mình, trong trường hợp đó, lệnh này sẽ được áp dụng tự động mỗi khi bạn khởi động gdb

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

NGUỒN: https://sourceware.org/gdb/wiki/BuildingOnDarwin


6
Hoạt động như một sự quyến rũ. Cảm ơn bạn.
pceccon

14
Như OP đã chỉ ra, điều này không phù hợp với anh ta (và đối với tôi cũng vậy).
PVitt

6
Có vẻ như nó không hoạt động macOS Sierravới các chứng chỉ tự ký.
loretoparisi

sudo killall taskgatedlà chìa khóa để giải quyết vấn đề của tôi
Karthikeyan Vaithilingam

Tôi đã làm theo các bước một cách chính xác và điều này hoạt động hiệu quả đối với tôi trên macOS Sierra.
jdg

29

Tôi đã làm cho gdb hoạt động trên OSX 10.9 mà không cần thiết kế mã theo cách này (được mô tả ở đây ):

  1. Cài đặt gdb với macports. (có thể bạn có thể bỏ qua)

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

    thay đổi tùy chọn chuỗi từ -sđể -sptại dòng 22, col 27.

  3. Khởi động lại máy tính.

  4. Sử dụng gdb. Nếu bạn đã cài đặt nó với các cổng mac thì bạn phải sử dụng ggdblệnh. Hoặc tạo bí danh trong tệp cấu hình của bạn:

alias gdb='ggdb'

và sử dụng lệnh 'gdb' sau đó.


Tôi đã gặp phải vấn đề này trong một thời gian và nhận thấy các cách thực hiện khác không hữu ích. Điều này làm việc như một sự quyến rũ.
Bill DeRose

@BillDeRose, tôi cũng vậy.
klm123

@nimrodm, ý bạn là "sudo gdb"? nó phải là "ggdb" với macports
klm123

1
Ặc. Tôi không muốn phải chạy gdbnhư sudo. Đó dường như là một rủi ro bảo mật không cần thiết.
Autumnsault

2
Sẽ không khởi động lại máy tính. Phải có lệnh để khởi động lại một cái gì đó!
Michael

27

Tôi đã nâng cấp lên gdb 8.3và không thể làm cho mọi thứ hoạt động. Điều này đã giúp tôi:

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

Trong đó nội dung của gdb.xmllà:

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

Tôi tìm thấy giải pháp này ở đây: https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

Lưu ý: Nếu không có quyền, tôi có thể chạy gdb với sudo.


2
Bạn sẽ làm gì nếu bạn nhận đượcerror: The specified item could not be found in the keychain.
Sridhar Sarnobat

@SridharSarnobat Sử dụng đường dẫn trước của câu trả lời này stackoverflow.com/a/32727069/339146
Panayotis

Không thành công sau khi thử câu trả lời của @maximser. Sau đó, điều này làm việc cho tôi. macOS 10.15.4, gdb 9.2 được cài đặt qua brew.
mặc đồ

@SridharSarnobat: Trước tiên, bạn phải tạo chứng chỉ stackoverflow.com/questions/35020236/…
Akansha

26

Tôi đã gặp vấn đề tương tự với GDB. Tôi đang chạy dưới Mac OS X 10.8.5hay còn gọi là Sư tử núi. Tôi đang sử dụng phiên bản GDB 7.7.1.

Tôi đã biên dịch chương trình thử nghiệm của mình bằng lệnh sau:

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

Nếu tôi đã nhập lệnh gdb sample.out, tôi nhận được cùng một thông báo lỗi khó hiểu:

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

Tuy nhiên, thông báo lỗi này là một con cá trích đỏ.

Giải pháp mà tôi thấy đã hiệu quả với tôi là chỉ cần gọi GDB bằng cách sử dụng superuser acct:

sudo gdb sample.out. 

Điều đó làm việc tốt cho tôi.

Và từ đó tôi có thể chạy GDB example.out mà không cần sử dụng sudo.

Hy vọng điều này sẽ giúp ích và hiệu quả cho những người khác. Trả lời nếu không.


1
Không chắc tại sao điều này lại bị bỏ phiếu. Tôi đã chạy lệnh dưới dạng root (với sudo) và nó đã hoạt động.
iProgram

6

Điều này không hiệu quả với tôi và tôi phải trải qua một thời gian dài. Đây là danh sách đầy đủ các bước tôi đã làm để nó hoạt động.

  1. Tạo chứng chỉ để ký gdb.

Thật không may, chứng chỉ hệ thống đã cung cấp cho tôi Unknown Error = -2,147,414,007rất hữu ích, vì vậy tôi phải thực hiện một giải pháp thay thế. KeyChain Assistant -> Create certificate ->

Chọn login,gdb-cert ,Code Signing

Sao chép / di chuyển chứng chỉ vào Chuỗi khóa hệ thống (nhập mật khẩu)

  1. Chọn chứng chỉ ( gdb-cert) bấm Get info->Trust Always
  2. Vô hiệu hóa startup-with-shell

Nhập vào bảng điều khiển: set startup-with-shell off

Ghi nhớ cấu hình: echo "set startup-with-shell off" >> ~/. gdbinit

  1. Bật người dùng gốc

Đi tới System Preferences-> Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it-> Edit(menu) ->Enable Root User

  1. sudo killall taskgated
  2. Cuối cùng ký gdb

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

  1. Vô hiệu hóa người dùng gốc (Bước 4)
  2. Khởi động lại nếu vẫn không hoạt động. (nếu không có gì khác hoạt động, rất có thể nó đã hoạt động)

Tái bút. Tôi kết thúc sử dụng lldbvì nó chỉ hoạt động ( hướng dẫn )


5

Đối với bất kỳ ai sử dụng Sierra 10.12.6 (trở lên) và Homebrew, /usr/local/bin/gdblà một liên kết tượng trưng đến /usr/local/Cellar/gdb/8.0/bin/gdb(hoặc bất kỳ phiên bản nào, ví dụ:8.0.1 :).

Bạn cần phải ký mã cả liên kết và mục tiêu:

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

Hoặc, nếu bạn đã greadlink(cài đặt qua brew install coreutils):

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

1
bạn đã thử cái này trên High Sierra chưa? Nó không làm việc cho tôi trên O / S: 10.13.6
rustyMagnet

3

Tôi tự hỏi liệu sự thay đổi toàn cầu trong câu trả lời được bình chọn cao nhất ở đây có gây ra một số hậu quả ngoài ý muốn hay không.

Thay vì kích hoạt quy ước Tiger cũ, taskgated cho phép chạy mã đã ký. Vì vậy, có thể tốt hơn là chỉ cần lấy chứng chỉ đã ký cho gdb, tương tự như câu trả lời ở đây .

Sau đó, tôi đã có thể sudosử dụng gdb. Nếu bạn cần sử dụng gdb w / o sudo thì có lẽ liên kết này sẽ hữu ích , xin từ chối trách nhiệm, tôi vẫn chưa thử vì sử dụng sudolà một giải pháp tốt cho bây giờ`.


3

Điều này có thể không liên quan. Bạn có thể sử dụng lldb trên macos thay vì gdb. Bạn không cần rắc rối này để cài đặt gdb.

lldb ( http://lldb.llvm.org ) đã được cài đặt theo mặc định trong High Sierra


0

Tôi có thể khuyên bạn nên làm theo ý chính sau: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

Với thủ thuật để khắc phục: unknown error = -2,147,414,007trong quá trình Tạo chứng chỉ được mô tả tại đây: https://apple.stackexchange.com/a/309123

Ghi chú:

Đường dẫn cho gdb được cài đặt dưới dạng homebrew gói phải giống như sau:/usr/local/Cellar/gdb/9.2/bin/gdb

csrutil enable --without debugsẽ gây ra một thông báo về requesting unsupported configuration, như ở đây: https://totalfinder.binaryage.com/system-integrity-protection

Kiểm tra:

  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;

Vấn đề của tôi cũng giống như anh chàng ở trên, được giải quyết bằng cách

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.