2008-10-09 4 views
6

저는 일반적으로 Windows 개발에서 작동하지 않으며 toolchain 및 빌드 시스템에 완전히 익숙하지 않습니다. 내 임베디드 제품에는 파일 시스템에 제 3 자의 일부 Windows DLL (파일 시스템을 마운트하는 Windows 시스템에서 사용되는)이 포함되어 있습니다.스트립 Windows DLL 디버그 정보?

나는이 DLL의 최신 릴리스가 이전 빌드와 비교하여 크기면에서 3 배가되고 더 이상 파일 시스템에 맞지 않는다는 문제점이 있습니다. DLL의 기능에는 많은 변화가 없었으므로 개발자는이 드롭에서 디버그 기호를 제거하는 것을 잊어 버린 것 같습니다. 나는 그들에게 물을 것이다. 그러나 시간대와 언어의 차이 때문에 종종 답을 얻는데 며칠이 걸린다.

누군가 VisualC에 익숙하지 않은 사람을위한 간단한 단계를 사용하여 DLL에 디버깅 정보가 포함되어 있는지 확인하는 방법과이를 제거하는 방법을 설명 할 수 있습니까?

답변

3

디버그 버전은 기본적으로 코드 최적화가 비활성화 된 상태로 컴파일되므로 개발자가 릴리스 버전을 구할 수도 있습니다. 따라서 디버깅 정보를 제거한 경우에도 코드는 효율적이지 않습니다. (어떤 디버그 트랩과 메시지도있을 수 있습니다.)

사용자가 가지고있는 DLL의 종류를 결정하는 한, Dependency Walker을 사용하면 DLL이 디버그 또는 릴리스 버전과 연결되어 있는지 확인할 수 있습니다. VC 런타임 라이브러리 (해당 라이브러리가 정적으로 링크되지 않은 것으로 가정)

5

일반적으로 디버그 정보 자체는 유닉스에서와 같이 바이너리에 추가되는 대신 별도의 *.pdb 파일 (Program DataBase)로 빌드됩니다. 개발자가 실제로 라이브러리의 디버그 버전을 빌드 한 경우 더 심각한 문제가 종속성의 문제 일 수 있습니다. 바이너리의 릴리스 버젼이 MSVCRT.DLL에 링크하고있는 경우는, 디버그 빌드는 MSVCRTD.DLL에 링크됩니다 (다른 런타임 라이브러리는 D 접미사로 이름이 유사합니다). 특정 바이너리에 대한 종속성을 찾으려면 시도 :

dumpbin /imports whatever.dll 

이것은 (그 도서관 모두 도서관의 명칭과 기호가 나열되어 있습니다) 라이브러리 whatever.dll에 대한 모든 런타임 종속성을 표시합니다. 예상되는 종속성 목록이 표시되지 않으면 원래 개발자가 라이브러리를 적절한 빌드 모드로 다시 빌드해야만 고칠 수있는 문제 일 수 있습니다.

5

Rebase는 Microsoft 도구 집합의 일부입니다. dll의 기본 주소를 설정하는 것 외에도 첨부 된 모든 디버그 정보를 별도의 .dbg 파일로 스트라이프 할 수 있습니다.

REBASE -i 0x10000000으로 -a -x. \ -p

당신은 이론적으로 시도하고 결정하는 DLL이 이미 고유 한 기본 주소로 구축되는 경우 그를 사용해야합니다. 또는 응용 프로그램에서 사용하는 다른 dll과의 충돌 가능성을 최소화하기 위해 기본 주소를 선택하여 창을로드 할 때 dll을 패치하지 않아도됩니다. 로더가 일상적으로 모듈의로드 주소를 보안 기능으로 무작위 할당하는 시대에, 기본 주소 설정을 더 어렵게 만드는 것은 확실하지 않습니다.

2

종속성 워커는 종속성을 표시하지만 디버깅 정보가 제거되었는지 여부는 표시하지 않습니다. 둘 모두를 보려면 PeStudio을 사용하십시오.

0

현재 유효하지 않은 릴리스 버전을 얻는 것과 같은 다른 제안은 무시됩니다. 개발자가 찾고자하는 도구는 실제로 Visual Studio (또는 SDK 또는 WDK)의 link.exe입니다.

코드와 함께 디버거를 사용할 수 있기를 원하면 공공 PDB 파일을 만들 수 있습니다. 그들이 원하는 옵션은 다음과 같습니다 :

/PDB:filename 
    /PDBSTRIPPED:filename 

그러나 나는 당신이 그것에 대해 많이 할 수 없다는 것을 두려워합니다. PDB 파일 자체는 별도의 파일이며 디버그 정보는 일반적으로 현대 MS 컴파일러의의 바이너리에 포함되지 않습니다 (일부 RTTI 항목이 포함될 수 있지만 ASSERT 및 이와 유사한 매크로 및 "함수"의 파일 이름 및 문자열은 제외) 이는인지 된 부 풀림에 대한 가장 가능성있는 설명 임).

참고 : WDK의 binplace.exe은 위의 플래그와 동일한 기능을 제공하지만 다소 복잡한 (WDK 빌드 프로세스에 적합 함에도 불구하고) 구문이 있습니다.