"gdb가 코드 서명되었는지 확인하십시오-taskgated (8) 참조"-홈브류 코드 서명으로 gdb를 설치하는 방법은 무엇입니까?


107

나는 osx 10.8.4 아래에 있으며 homebrew와 함께 gdb 7.5.1을 설치했습니다 (동기 부여는 --with-python 등과 같은 새로운 기능으로 새로운 gdb를 얻습니다 ...)

C ++ Eclipse 프로젝트 내에서 디버그를 실행할 때 짧은 이야기는 다음과 같습니다.

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

코드 서명에 대한 다양한 제안을 따랐습니다.

그래서 나는 :

  1. 인증서 설정
  2. gdb-> codesign -s gdb-cert / usr / local / bin / gdb에 서명합니다.

Eclipse에서 디버깅을 다시 실행하면 위와 동일한 오류가 발생합니다. "(gdb가 코드 서명되었는지 확인하십시오-taskgated (8) 참조)".

gdb를 이전 gdb (Eclipse의 gdb 환경 설정) / usr / libexec / gdb / gdb-i386-apple-darwin으로 다시 설정하면 디버깅이 예상대로 실행됩니다.

거기에 해결책 / 힌트가 있습니까?

고마워

Pelle


이것은 "보안 기능"이 아닙니다. 즉, 시스템이 공식적으로 서명 된 소프트웨어 만 허용하도록 구성되어 있습니까? 그렇다면이 기능을 끄는 방법이 있기를 바랍니다.
Mats Petersson

귀하의 의견에 대한 확인 감사 - 나는 당신의 보안 기능 점을 이해하지만 내 문제는 서명을 수행하는 방법 다음은 ... 비슷한 게시물이 stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion는 어떤 didn를 ' t 아직 나를 위해 그것을 해결
pellekrogholt

답변:


136

이 오류는 OSX가 바이너리가 다른 프로세스 pid에 액세스하기 위해 디지털 서명이 필요한 pid 액세스 정책을 구현하기 때문에 발생합니다. 다른 프로세스에 대한 gdb 액세스를 활성화하려면 먼저 바이너리에 코드 서명을해야합니다. 이 서명은 사용자가 생성하고 시스템에 등록해야하는 특정 인증서에 따라 다릅니다.

코드 서명 인증서를 생성하려면 키 체인 접근 애플리케이션을 엽니 다. 메뉴 키 체인 접근-> 인증서 지원-> 인증서 생성…을 선택합니다.

인증서 이름 (예 : gdb-cert)을 선택하고 ID 유형을 자체 서명 된 루트로 설정하고 인증서 유형을 코드 서명으로 설정 한 다음 기본값 덮어 쓰기를 선택합니다. 인증서 위치 지정 화면이 나타날 때까지 계속을 여러 번 클릭 한 다음 키 체인을 시스템으로 설정하십시오.

인증서를 두 번 클릭하고 신뢰 섹션을 열고 코드 서명을 항상 신뢰로 설정하십시오. 키 체인 접근 애플리케이션을 종료합니다.

taskgated 서비스를 다시 시작하고 바이너리에 서명합니다.

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

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

macOS 10.12 (Sierra) 이상에서는 다음을 수행해야합니다.

gdb 7.12.1 이상 사용 또한 gdb가 셸을 사용하여 디버깅 할 프로그램을 시작하지 못하도록합니다. gdb 내에서 다음 명령을 사용할 수 있습니다.

set startup-with-shell off

이 마지막 명령을 홈 디렉토리의 .gdbinit 파일에 넣을 수도 있습니다.이 경우 gdb를 시작할 때마다 자동으로 적용됩니다.

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

출처 : https://sourceware.org/gdb/wiki/BuildingOnDarwin


6
매력처럼 작동합니다. 감사합니다.
pceccon

14
OP가 지적했듯이 이것은 그를 위해 트릭을 수행하지 않았습니다 (그리고 나도 마찬가지입니다).
PVitt 2015

6
macOS Sierra자체 서명 된 인증서로는 작동하지 않는 것 같습니다 .
loretoparisi

sudo killall taskgated내 문제 해결의 열쇠
Karthikeyan Vaithilingam

나는 단계를 정확하게 따랐고 이것은 macOS Sierra에서 나를 위해 아름답게 작동했습니다.
jdg aug

29

이 방법으로 코드 서명하지 않고 OSX 10.9에서 gdb를 작동하도록 만들었습니다 ( 여기에 설명되어 있음 ).

  1. macports와 함께 gdb를 설치합니다. (건너 뛸 수 있음)

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

    옵션 문자열을 22 행, 열 27 에서 -s로 변경하십시오 -sp.

  3. 컴퓨터를 재부팅하십시오.

  4. gdb를 사용하십시오. Mac 포트와 함께 설치 한 경우 ggdb명령 을 사용해야합니다 . 또는 구성 파일에 별칭을 만들었습니다.

alias gdb='ggdb'

그런 다음 'gdb'명령을 사용하십시오.


나는 한동안이 문제를 겪었고 다른 방법이 도움이되지 않는다는 것을 발견했습니다. 이것은 매력처럼 작동했습니다.
Bill DeRose

@BillDeRose, 나도 마찬가지입니다.
klm123

@nimrodm, "sudo gdb"를 의미합니까? macports에서는 "ggdb"여야합니다
klm123

1
으. 나는 실행하고 싶지 않아요 gdb으로 sudo. 그것은 불필요한 보안 위험처럼 보입니다.
Autumnsault 2014 년

2
컴퓨터를 다시 시작하지 않습니다. 뭔가를 다시 시작하라는 명령이 있어야합니다!
마이클

27

나는로 업그레이드했지만 gdb 8.3일을 작동시킬 수 없었습니다. 이것은 나를 도왔습니다.

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

의 내용 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>

이 솔루션을 여기에서 찾았습니다. https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

참고 : 권한이 없으면으로 gdb만 실행할 수있었습니다 sudo.


2
당신이 얻는다면 무엇을합니까error: The specified item could not be found in the keychain.
Sridhar Sarnobat

@SridharSarnobat이 답변의 파이프 라인을 먼저 사용하십시오. stackoverflow.com/a/32727069/339146
Panayotis

@maximser의 답변을 시도한 후 실패했습니다. 그러면 이것은 나를 위해 작동합니다. brew를 통해 설치된 macOS 10.15.4, gdb 9.2.
weaming

@SridharSarnobat : 먼저 인증서를 만들어야합니다. stackoverflow.com/questions/35020236/…
Akansha

26

GDB에서 동일한 문제가 발생했습니다. 나는 Mac OS X 10.8.5일명 Mountain Lion 아래에서 달리고 있습니다. GDB 버전을 사용하고 7.7.1있습니다.

다음 명령으로 테스트 프로그램을 컴파일했습니다.

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

명령을 입력하면 gdb sample.out동일한 암호 오류 메시지가 나타납니다.

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

그러나이 오류 메시지는 붉은 청어입니다.

내가 찾은 해결책은 수퍼 유저 계정을 사용하여 GDB를 호출하는 것입니다.

sudo gdb sample.out. 

그것은 나를 위해 잘 작동합니다.

그리고 그 시점부터 sudo를 사용하지 않고 GDB example.out을 실행할 수 있습니다.

이것이 다른 사람들에게 도움이되기를 바랍니다. 그렇지 않은 경우 회신하십시오.


1
왜 이것이 반대 투표인지 잘 모르겠습니다. 나는 루트 (sudo 사용)로 명령을 실행했으며 작동했습니다.
iProgram 2015 년

6

이 중 어느 것도 나를 위해 일하지 않았고 나는 장기적으로 가야했습니다. 다음은 작업을 수행하기 위해 수행 한 전체 단계 목록입니다.

  1. gdb에 서명 할 인증서를 만듭니다.

불행히도 시스템 인증서 Unknown Error = -2,147,414,007는 매우 도움이 되었기 때문에 해결 방법을 찾아야했습니다. KeyChain Assistant -> Create certificate ->

선택 login, gdb-cert,Code Signing

인증서를 시스템 키 체인으로 복사 / 이동 (암호 입력)

  1. 인증서 선택 ( gdb-cert) 클릭 Get info->Trust Always
  2. 비활성화 startup-with-shell

콘솔에 입력 : set startup-with-shell off

구성 기억 : echo "set startup-with-shell off" >> ~/. gdbinit

  1. 루트 사용자 활성화

이동 System Preferences> - Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it> - Edit(메뉴) ->Enable Root User

  1. sudo killall taskgated
  2. 마지막으로 gdb에 서명

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

  1. 루트 사용자 비활성화 (4 단계)
  2. 그래도 작동하지 않으면 재부팅하십시오. (아무것도 작동하지 않으면 이미 작동 할 가능성이 높습니다)

추신. lldb그냥 작동하기 때문에 사용 하게됩니다 ( 튜토리얼 )


5

Sierra 10.12.6 (이상) 및 Homebrew를 사용하는 모든 사용자에게 /usr/local/bin/gdb심볼릭 링크입니다 /usr/local/Cellar/gdb/8.0/bin/gdb(또는 모든 버전, 예 :) 8.0.1.

링크와 대상을 모두 코드 서명해야합니다.

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

또는 다음을 greadlink통해 설치 한 경우 brew install coreutils:

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

1
High Sierra에서 이거 해봤 어? O / S에서 작동하지 않았습니다. 10.13.6
rustyMagnet

3

여기 에서 가장 많이 득표 한 답변 의 글로벌 변화 가 의도하지 않은 결과를 초래 하는지 궁금합니다 .

이전 Tiger 규칙을 활성화하는 대신 taskgated는 서명 된 코드 실행을 허용합니다. 따라서 여기 답변 과 유사한 gdb에 대한 서명 된 인증서를 얻는 것이 더 나을 수 있습니다 .

그 후 sudogdb 를 사용할 수있었습니다 . sudo없이 gdb를 사용해야하는 경우 아마도이 링크가 도움이 될 것입니다 . 면책 조항, 사용하는 sudo것이 현재로서는 괜찮은 솔루션 이기 때문에 아직 시도하지 않았습니다 .


3

이것은 관련이 없을 수 있습니다. gdb 대신 macos에서 lldb를 사용할 수 있습니다. gdb를 설치하는 데이 번거 로움이 필요하지 않습니다.

lldb ( http://lldb.llvm.org )는 기본적으로 High Sierra에 이미 설치되어 있습니다.


0

이 요점을 따르는 것이 좋습니다 : https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

극복 할 수있는 방법 : unknown error = -2,147,414,007여기에 설명 된 인증서 생성 중 : https://apple.stackexchange.com/a/309123

노트:

homebrew패키지로 설치된 gdb의 경로는 다음과 같아야합니다./usr/local/Cellar/gdb/9.2/bin/gdb

다음과 같이 csrutil enable --without debug에 대한 메시지가 표시 requesting unsupported configuration됩니다. https://totalfinder.binaryage.com/system-integrity-protection

테스트:

  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;

내 문제는 위의 사람과 동일합니다.

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.