나는 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))
코드 서명에 대한 다양한 제안을 따랐습니다.
그래서 나는 :
- 인증서 설정
- 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
답변
이 오류는 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
답변
이 방법으로 코드 서명하지 않고 OSX 10.9에서 gdb를 작동하도록 만들었습니다 ( 여기에 설명되어 있음 ).
-
macports와 함께 gdb를 설치합니다. (건너 뛸 수 있음)
-
sudo nano /System/Library/LaunchDaemons/com.apple.taskgated.plist
옵션 문자열을 22 행, 열 27 에서
-s
로 변경하십시오-sp
. -
컴퓨터를 재부팅하십시오.
-
gdb를 사용하십시오. Mac 포트와 함께 설치 한 경우
ggdb
명령 을 사용해야합니다 . 또는 구성 파일에 별칭을 만들었습니다.
alias gdb='ggdb'
그런 다음 ‘gdb’명령을 사용하십시오.
답변
나는로 업그레이드했지만 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
.
답변
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을 실행할 수 있습니다.
이것이 다른 사람들에게 도움이되기를 바랍니다. 그렇지 않은 경우 회신하십시오.
답변
이 중 어느 것도 나를 위해 일하지 않았고 나는 장기적으로 가야했습니다. 다음은 작업을 수행하기 위해 수행 한 전체 단계 목록입니다.
- gdb에 서명 할 인증서를 만듭니다.
불행히도 시스템 인증서 Unknown Error = -2,147,414,007
는 매우 도움이 되었기 때문에 해결 방법을 찾아야했습니다.
KeyChain Assistant -> Create certificate ->
선택 login
, gdb-cert
,Code Signing
인증서를 시스템 키 체인으로 복사 / 이동 (암호 입력)
- 인증서 선택 (
gdb-cert
) 클릭Get info
->Trust Always
- 비활성화
startup-with-shell
콘솔에 입력 : set startup-with-shell off
구성 기억 :
echo "set startup-with-shell off" >> ~/. gdbinit
- 루트 사용자 활성화
이동 System Preferences
> – Users & Groups
-> Unlock it
-> Login Options
-> Network Account Server
-> Join
-> Unlock it
> – Edit
(메뉴) ->Enable Root User
sudo killall taskgated
- 마지막으로 gdb에 서명
codesign -fs gdb-cert "$(which gdb)"
- 루트 사용자 비활성화 (4 단계)
- 그래도 작동하지 않으면 재부팅하십시오. (아무것도 작동하지 않으면 이미 작동 할 가능성이 높습니다)
추신. lldb
그냥 작동하기 때문에 사용 하게됩니다 ( 튜토리얼 )
답변
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))
답변
여기 에서 가장 많이 득표 한 답변 의 글로벌 변화 가 의도하지 않은 결과를 초래 하는지 궁금합니다 .
이전 Tiger 규칙을 활성화하는 대신 taskgated는 서명 된 코드 실행을 허용합니다. 따라서 여기 답변 과 유사한 gdb에 대한 서명 된 인증서를 얻는 것이 더 나을 수 있습니다 .
그 후 sudo
gdb 를 사용할 수있었습니다 . sudo없이 gdb를 사용해야하는 경우 아마도이 링크가 도움이 될 것입니다 . 면책 조항, 사용하는 sudo
것이 현재로서는 괜찮은 솔루션 이기 때문에 아직 시도하지 않았습니다 .