NSLog로 iOS 8 확장을 디버깅하는 방법은 무엇입니까?


90
- (void)viewDidLoad
{
    NSLog(@"%s", __func__);
    // ...
}

에서 viewDidLoad아이폰 OS 8의 확장 . NSLog엑스 코드에 아무것도 출력한다. NSLog하지만 컨테이너 앱에서는 평소처럼 작동합니다.

확장에서 디버그 메시지의 출력을 얻으려면 어떻게해야합니까?


나도이 문제가 있습니다. NSLog가 깨졌을 수도 있습니다. 지금은 중단 점을 사용하여 값을 디버깅합니다. 그러나 그들은 정말 버그가 있습니다.
gallileo 2014-06-04

디버거가 래치되지 않고 항상 Xcode에서 "연결 대기 중"이라고 말하는 비슷한 문제가 있습니다. 불행히도 인터넷 검색에서 아무 쓸모가 없으며 아직 답변이없는 스택에 질문을 게시했습니다.
Alex Bollbach

답변:


95
  1. 디버깅은 앱 확장에 대해 작동합니다.
  2. 시뮬레이터에서도 작동합니다.
  3. 앱 확장이 시뮬레이터에서 충돌하는 경우 앱 확장을 다시 시작하는 것이 쉽지 않을 수 있습니다. 시뮬레이터를 다시 시작하는 것이 빠른 해결책입니다.
  4. 앱 확장을 디버깅하는 단계 :

    1. 컨테이너 앱을 실행합니다. 이 단계에서 Xcode는 컨테이너 앱과 앱 확장을 디바이스 또는 시뮬레이터에 업로드합니다.

    2. 컨테이너 앱을 중지합니다. 이 단계는 시뮬레이터에서 디버그 할 때 중요합니다. 그렇게하지 않으면 Xcode는 시뮬레이터가 사용 중이라고 알려줍니다.

    3. Xcode에서 Debug-> Attach to Process-> By Process Identifer (PID) 또는 Name ... 메뉴를 누르고, com.abc.ContainerApp.MyExtension과 같은 앱 확장 식별자를 입력하여 디버깅을 시작합니다. 중단 점을 설정하는 것을 잊지 마십시오. (2014 년 8 월 25 일 업데이트 : MyExtension (확장자 이름)을 직접 입력 할 수 있습니다.)

    4. 기기 또는 시뮬레이터에서 앱 확장을 엽니 다.


2014 년 8 월 23 일 업데이트 :

위의 디버깅 단계가 시뮬레이터의 iOS 8 SDK 베타 5가있는 Xcode 6 베타 6에서 제대로 작동하지 않음을 발견했습니다.

해결책:

  1. 시뮬레이터에서 확장을 실행하십시오.
  2. Xcode 메뉴 디버그-> 프로세스에 연결-> 메뉴의 시스템 섹션에서 "MyExtension (확장자 이름)"을 선택합니다.

중단 점이 작동합니다. 그러나 로그가 출력 창에 표시되지 않는 이유를 모르겠습니다.


8
지금까지 찾은 가장 쉬운 디버깅 방법 (NSLog 참조)은 다음 단계를 따르는 것입니다. /// 1 /// 컨테이너 앱 스키마를 선택하고 실행합니다. /// 2 /// 일단 실행되면-XCode로 다시 전환하고 (중지 버튼을 누르지 않고도) 확장 스키마를 선택한 다음 실행 버튼을 누릅니다. /// 3 /// 실행할 앱을 선택하라는 메시지가 표시되면 오늘을 선택합니다. /// 4 /// 이제 중단 점과 NSLog가 문제없이 작동합니다.
중단

1
이것은 오늘날, 특히 충돌 이후에도 작동하지 않습니다. 이것은 매우 성가신 일입니다. 왜 고치기가 그렇게 어려운지 이해할 수 없습니다.
크리스티 Băluţă

3
나는 위의 업데이트 된 지침을 사용하려고 시도했으며 저에게 효과적이었습니다. 그러나 2 단계에서는 확장 이름을 사용하는 대신 "By Process Identifier (PID) 또는 Name ..."을 사용하고 프로세스의 pid를 입력했습니다. 이것은 마술처럼 내 브레이크 포인트를 사용할 수있게 해주었습니다.
tony.tc.leung

디버그> PID 또는 이름으로 프로세스에 연결 : 텍스트 필드에 com.company.AppName.AppName - ExtensionName 서 같은 디버그 탐색기에서 프로세스 이름을 입력
TigerCoding

이 답변은 질문과 관련이 없습니다. OP는 NSLog 메시지가 확장에서 콘솔에 작성되지 않는 이유를 묻습니다 (같은 질문 으로이 페이지에 왔을 때 합법적 인 우려). 그는 디버거에 연결하는 문제에 대해서는 언급하지 않습니다.
조이 카슨

49

나도이 문제가 있습니다. Debug-> Open System Log ... 메뉴에서 시뮬레이터로 이동하면 저에게 효과적입니다.

여기에서 iPhone Simulator의 모든 로그 (확장 프로그램의 로그 포함)를 볼 수 있습니다.

여기에 이미지 설명 입력


이 열립니다 "~ / 라이브러리 / 로그 / CoreSimulator / <DEVICE_IDENTIFIER> /system.log" 쉽게 다른 시뮬레이터 장치 로그가 모두 찾을 수 있도록 너무 단지 대체 <DEVICE_IDENTIFIER> 시뮬레이터 장치 ID와
Hofi

32

NSLog완벽하게 작동하고 있습니다 .

Xcode 디버거가 확장에 연결되어 있지 않기 때문에 Xcode의 디버그 영역에 무엇이 기록되고 있는지 볼 수 없습니다. 확장은 거의 포함 된 앱 완전히 독립적입니다. 예를 들어, 별도의 번들 식별자가 있으며 OS에서 별도의 프로세스이기도합니다.

Xcode를 확장에 연결하는 데 다양한 성공을 거두었습니다. 자동으로 연결되는 것처럼 보이며 디버그 탐색기에 "Waiting to attach"로 표시되지만 연결되지는 않습니다.

때로는 Xcode에서 확장 대상을 실행할 수 있습니다.

여기에 이미지 설명 입력

그런 다음 내 확장 프로그램을 실행할 응용 프로그램을 선택할 수 있습니다.이 경우에는 알림 센터 인 "오늘"권장 사항을 선택합니다.

여기에 이미지 설명 입력

그리고 때때로 디버거를 내 확장에 연결합니다. 이 방법은 물리적 장치에서만 작동합니다.

첨부되지 않으면 @VinceYaun의 답변에서 수동 첨부 방법을 사용할 수 있습니다.

나는 또한 다른 부착 방법을 사용하여 다양한 성공을 거두었습니다. 대부분은 실패했으며 나중에 수정 될 버그 일뿐입니다.

로그 메시지를 보려면 상단 표시 줄의 Window-> 로 이동 Devices하여 장치를 선택하십시오. 해당 창 하단에서 장치 로그를 불러올 수 있습니다. 시뮬레이터에서 테스트하는 경우 @BalestraPatrick의 답변을 사용할 수 있습니다. .

일부 버그는 베타 2에서 수정되었으며, 내 생각에는 결국 확장 프로그램을 시작할 때 디버거가 자동으로 연결될 것입니다.

업데이트 : iOS 8 베타 4 릴리스 노트 :

확장

베타 4에서 수정 됨

  • Xcode에서 디버깅 할 때 확장이 실행되지 않는 경우가 있습니다.
  • UI가있는 확장이 종료되면 다시 시작되고 닫히지 않습니다.
  • 때때로 공유 또는 작업 확장 프로그램이 중단 될 수 있습니다.
  • 확장을 재배포하면 알림 센터에서 확장이 비활성화 될 수 있습니다.

Storage Extensions에 대해 동일한 접근 방식을 시도 했습니까?
SRP-Achiever

Xcode 6 베타 2에서는 작동하지 않았지만 Vince Yuan 대답 은 작동했습니다. 불행히도 Xcode 6 베타 3에서는 확장 디버깅이 전혀 작동하지 않습니다. 그 문제에 대한 해결책을 찾지 못했습니다. 아마도 다음 릴리스를 기다려야 할 것입니다.
Darrarski

@Darrarski 내 대답은 베타 1에서 남았습니다. 참고로, 베타 3이 나왔으므로 지금 쯤이면 그것에 대해해야합니다.
산타 클로스

@SantaClaus 꽤 명확합니다. 내 의견은 주어진 솔루션 중 어느 것도 Xcode 6 베타 3에서 작동하지 않는다는 것을 알리는 것입니다. 이 릴리스에서는 확장 디버깅이 훨씬 더 손상된 것 같습니다. 다음 베타가 문제를 해결하기를 바랍니다.
Darrarski

3
베타 4 (현재 베타 5)에서는 이러한 버그가 수정 된 것으로 보이지 않았습니다.
matt

18

나도이 문제가 있습니다. Xcode는 내 디버거를 확장에 연결하거나 NSLog 메시지를 표시하지 않습니다. Xcode 디버거를 확장 프로세스에 수동으로 연결하면 최소한 중단 점이 매력처럼 작동합니다.

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")

5
나는 이것과 행운이 섞여 있었다.
Santa Claus

2
항상 작동하는 것은 아니지만 upvote는 Apple이 향후 릴리스에서 자동으로 디버거를 확장에 연결할 수 있기를 바랍니다.
Jing

14
  1. 확장에 대한 구성표 만들기
  2. 계획 실행
  3. 대화 상자에서 컨테이너 앱 선택
  4. 즐겨

그것은 나를 위해 작동합니다 :)


이것은 내가 필요 정확히
pob21

1
NSLog컨테이너 앱을 실행하는 경우에만 작동합니다. 그것은 하지 않습니다 대신 컨테이너의 앱 확장을 실행하는 경우 작동합니다.
JaredH

이것은 나에게도 효과적이었습니다. 감사합니다, Maciek Czarnik! 위의 솔루션은 저에게 효과적이지 않았습니다. Xcode 8.1을 사용하고 있습니다.
plam4u

5

Xcode 8은 확장 기능을 디버깅 할 수 있습니다.

  1. 중지 버튼 옆의 콤보에서 확장 체계를 선택하고 실행하십시오.
  2. 나타나는 대화 상자에서 상위 응용 프로그램을 선택합니다.

결과 : 중단 점과 로그는 평소와 같이 작동합니다.


2
오늘 연장의 경우 작동하지 않습니다. 점점 꽝 오류 : LD : 라이브러리를 찾을 수 없습니다 -lRPush 그 소리 : 오류 : 링커 명령 (호출을보기 위해 사용 -v) 종료 코드 1로 실패
BadmintonCat

이것은 관련없는 오류입니다. 누락 된 라이브러리에 연결하려고합니다. 대상에 Liferay-Push를 추가하십시오.
Jano

4

Michael의 제안Apple의 문서를 기반으로 마침내 디버깅 영역에서 로그를 볼 수 있었던 이유 같습니다.

시뮬레이터에서 앱 확장을 빌드 및 실행하고 호스트 앱을 묻는 메시지가 표시되면 확장을 호출 할 특정 앱을 선택합니다 . 제 경우에는 PDF에서 공유 시트를 가져와 Safari에서 Action 확장 프로그램을 시작했습니다.

이전에는 작동하지 않았던 것은 Today를 호스트로 사용하라는 다른 사람들의 제안을 따르고 그 앱을 종료하고 Safari로 이동하여 내 확장 번호를 호출하는 것입니다. 더 이상 확장 프로그램을 실행하기 전에 포함 된 앱을 먼저 실행할 필요도 없습니다.

Apple의 문서에서 :

확장 체계의 실행 단계에서 호스트 앱을 실행 파일로 지정합니다. 지정된 호스트의 UI를 통해 확장에 액세스하면 Xcode 디버거가 확장에 연결됩니다.



1

나를 위해 일하는 트릭은 (아주 못생긴 것이지만) UILabel내 확장의 하단 모서리에 더미를 배치하는 것입니다. 나는 보통 그것을 부른다logLabel . 그런 다음 기록하려는 로그 문으로이 레이블의 텍스트를 업데이트 할 수 있습니다. 다른 클래스의 인스턴스에서 명령문을 기록해야하는 경우 이러한 접근 방식은 그다지 좋지 않습니다. 그리고 분명히 UI를 복잡하게 만듭니다.

그러나 매우 간단한 위젯이 있고 UI가 약간 어수선 해져도 괜찮다면이 방법을 사용할 수 있습니다. 나는이 토론에 설명 된 다른 모든 솔루션을 시도했지만 슬프게도 그들 중 어느 것도 나를 위해 일하지 않았습니다.


1

저에게 디버깅이 작동하는 유일한 방법은 Debug-> Attach To Process By PID or Name을 선택하는 것입니다. 그런 다음 확장 이름이 아닌 PID를 입력하십시오 . 장치에서 확장을 실행하여 PID를 찾을 수 있습니다. 창-> 장치로 이동하십시오. 장치를 찾고 본체를 봅니다. 내선 이름이 표시되면 그 뒤에 5 자리 숫자가 표시됩니다. 그것이 PID입니다

또한 PID를 찾기 위해 확장에 NSLog를 많이 넣었습니다. 이것은 xCode 7에 있습니다.


1

확장에 대한 동일한 문제가 발생합니다. NSLog 및 중단 점 . 나는 여러 날 동안 그것을 싸웠다.

Device log다음 이미지에서 찾을 수 있습니다. 그것은XCode -> Window -> Devices and Simulators 있습니다.

를 입력하면 Open Console대화 상자의 오른쪽 상단에 검색 필드가 있습니다. 거기에 필터 규칙을 적용 할 수 있습니다. 예를 들어, 프로세스 이름에 Notification키워드 가 포함 되거나 프로세스 이름이 확장 대상의 이름과 동일해야합니다 (예 : MyNotificationServiceExtension프로세스 이름 과 동일) .

장치 로그


0

Xcode6-B5에서 분명히 무언가가 깨졌습니다.

시뮬레이터에서 사진 확장을 실행하려고하면 확장 첨부 프로세스에 대한 옵션으로 Photos.app이 표시되지 않습니다.

시뮬레이터 내의 디버그 옵션

실제 장치에서 실행되는 것과 동일하게 올바른 동작을 제공합니다.

실제 장치로 디버그 옵션

첫 번째 경우에는 중단 점이 적용되지 않습니다. 후자의 경우 중단 점은 매력처럼 작동합니다.


0

컨테이너 앱과 확장은 iOS에서 완전히 두 가지 프로세스이며 LLVM은 한 번에 스레드 만 디버깅하므로 디버깅 할 때 콘솔은 확장을 기록하지 않고 중단 점에서 멈추지 않습니다.

@Vince Yuan의 방법으로 대부분의 문제를 해결할 수 있습니다.

그러나 내 문제는 Xcode 디버거가 iOS 시뮬레이터와 장치 모두에서 내 키보드 확장에 거의 연결되지 않는다는 것입니다. @Vince Yuan의 방법도 가끔 작동합니다.

내 작은 경험은 디버그 체계를 실행할 때 왼쪽 패널의 디버그 세션에 '디버그 세션 없음'이 표시되면 확장을 열고 테스트 할 필요가 없으며 디버거가 연결되지 않고 실행됩니다. 행운을 위해 다시.

그러나 com.xxx.xxx.xxx가 연결 대기 중임을 확인하면 확장 프로그램이 확실히 디버깅 될 수 있습니다.

이것은 iOS 확장, 특히 키보드 확장을 디버깅 할 수없는 사람을위한 작은 트릭입니다.


0

Xcode 6 Beta 5부터는 iOS8을 실행하는 실제 장치를 사용하여 내 확장 프로그램을 디버깅 할 수있었습니다. 장치에서 실행하고 Safari를 선택하여 실행하십시오.


0

IDE 변경으로 인한 모든 상태를 극복하기 위해 lemonjar.com의 iOS 콘솔을 사용하고 있습니다. 프로세스 ID에 관계없이 연결된 iOS 장치 렌더링 syslog 메시지에 대한 콘솔 창을 표시합니다. 여기에서 앱 및 확장 디버그 로그 메시지를 동시에 볼 수 있습니다.


0

아래에서 설명하는 방식으로 내 확장을 디버깅 할 수 있습니다.

  1. Xcode : Debug-> Attach to process by PID or Name. 확장 체계 이름.
  2. 그런 다음 당신을 선택 main app target하고 실행하십시오.

나는 당신들에게도 효과가 있기를 바랍니다.

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