2010-03-31 4 views
3

OS X에서 애플리케이션을 도킹에서 시작할 때만 디버깅합니다. 응용 프로그램이 명령 줄에서 시작될 때 발생하지 않습니다. 두 시나리오의 차이점은 무엇입니까? 내가 함께 일하고있는 코드는 제 3 자 앱에로드되는 C++ 기반 번들 플러그인입니다. 두 시나리오에서 GDB를 사용하여 프로세스에 연결했는데 명령 행에서 실행할 때 두 개의 추가 dylib가 프로세스에로드되고 내 라이브러리의 기본 주소가 약간 다르다는 점만 볼 수 있습니다. 두 가지 시나리오. 내 연결을 -prebind 및/또는 -bind_at_load로 변경하려고 시도했습니다.OS X에서 도킹 프로세스를 시작하는 것부터 시작하는 것까지의 차이점

+0

A. 문제가 무엇인지, B. 예상되는 동작이 무엇인지, C. 실제로 무엇이 일어나고 있는지를 알려주는 것이 훨씬 더 도움이 될 것입니다. –

+0

+1. 문제는 Josh가 겪고있는 것과 상관없이 "독에서부터 OS X에서 명령 행을 시작하는 것의 차이점"입니다. – z5h

+0

불행히도 저는 "중간에있는 사람"으로 일하고 있습니다. 우리 파트너 중 한 명이 라이브러리 문제를 해결하는 데 도움이되었습니다 ... 코드는 없지만 :) 자세한 정보를 얻으려면 시간이 걸렸습니다. 특별히 일어나고있는 일은 유니 코드 "RIGHT SINGLE QUOTATION MARK"문자의 경우 icu4c의 "unorm_normalize"기능이 응용 프로그램이 도크에서 실행될 때만 오류를 반환한다는 것입니다. –

답변

1

중요한 차이점 중 하나는 초기 작업 디렉토리가 각각 다를 것입니다. 응용 프로그램은 작업 디렉토리에 대한 어떠한 가정도해서는 안되며, 흥미로운 경우에는 깨뜨릴 것입니다.

+0

더 많은 조사를 토대로이 문제는 메모리 손상 문제라고 생각하기 시작했으며 "독에서만"증상은 빨간색 청어입니다. 비록 그것이 내 문제로 보이지는 않지만, 다른 작업 디렉토리는 확실히 가능성을 내놓으려고 할 때 내가 살펴본 것입니다. 팁 고마워! –

1

Dock 아이콘에서 실행 된 응용 프로그램은 사용중인 셸에서 설정할 수있는 동일한 환경 변수를 선택하지 않습니다. 환경에서 무언가를 집어내는 것에 의존한다면, 다른 접근법을 찾아야 할 것입니다. PATH, HOME, LOGNAME 등과 같은 env 변수를 얻을 수 있습니다. 그러나 HOSTTYPE, LANG, OSTYPE 등을 찾고 있다면 그들은 존재하지 않을 것입니다.

0

이 경우 내 문제는 공유 라이브러리가로드 된 순서의 차이로 인해 발생했습니다. 우리 응용 프로그램이 사용하는 써드 파티 라이브러리 중 하나는 전역 네임 스페이스로 확장 라이브러리를로드합니다. 동일한 라이브러리의 다른 버전과의 심볼 충돌이있었습니다. 확장 라이브러리가 전역 풀에로드되는 순서는 응용 프로그램이 doc에서 시작되었는지 아니면 명령 줄에서 시작되는지에 따라 달라집니다.

0

비슷한 상황에서 앱 번들에서 실행할 때 충돌이 발생합니다. 하나의 가능성은 우리가 이미 할당을 해제 한 메모리를 사용하고 있다는 것입니다. 예 : free() 또는 delete 뒤에 포인터 나 클래스 필드를 사용하십시오.

앱 번들이 할당 해제 된 메모리를 제로/수정하는 다른 free/delete 구현과 동적으로 연결되어있는 것처럼 보입니다.

이러한 종류의 버그는 다른 플랫폼/컴파일러 (예 : Linux/gcc, Windows/Visual Studio, 명령 줄에서 macOS/clang)를 사용하여 나타나지 않을 수 있으며 프로그램이 응용 프로그램 번들 (macOS/clang) Finder/dock에서 가져 오기).