다음을 통해 공유


제거할 공용 기호 선택

PDBCopy는 제거된 기호 파일에서 임의의 공용 기호 집합을 제거할 수 있도록 -f 및 -F 옵션을 제공하므로 디버깅을 수행하기 위해 대상 그룹이 액세스해야 하는 기호만 남깁니다.

PDBCopy의 일반적인 용도는 OCA(온라인 충돌 분석) 프로그램에서 Microsoft에서 사용할 특수 버전의 기호 파일을 만드는 것입니다. OCA는 특정 함수를 불활성으로 지정할 수 있습니다. 즉, 스택 추적에서 함수가 발견되면 무시됩니다. 함수는 일반적으로 중요한 계산을 수행하지 않는 래퍼 또는 "통과" 함수인 경우 비활성으로 선언됩니다. 이러한 함수가 오류 분석의 스택에서 발견되면 이 함수 자체가 잘못이 아니며, 스택의 이전 루틴에서 받은 유효하지 않거나 손상된 데이터를 전달했다고 가정할 수 있습니다. 이러한 기능을 무시하면 OCA는 오류 또는 손상의 실제 원인을 더 잘 확인할 수 있습니다.

당연히 "inert"를 선언하려는 모든 함수는 OCA에서 사용하는 기호 파일의 공용 기호 테이블에 포함되어야 합니다. 그러나 다음 예제와 같이 포함해야 하는 유일한 함수는 아닙니다.

Windows 드라이버를 작성하고 PDBCopy를 사용하여 FunctionOneFunctionSix, 두 개의 불활성 함수를 제외하고 해당 기호 파일에서 모든 공용 기호를 제거한다고 가정합니다. 충돌 후 스택에서 FunctionOne 또는 FunctionSix 가 발견되면 OCA에서 무시됩니다. 드라이버의 다른 부분이 스택에 있는 경우 Microsoft는 해당 메모리 주소를 제공하며 이 주소를 사용하여 드라이버를 디버그할 수 있습니다.

그러나 드라이버가 다음 레이아웃에서 메모리를 차지한다고 가정해 보겠습니다.

주소 메모리 내용

0x1000

모듈의 기본 주소

0x2000

FunctionOne의 시작

0x203F

FunctionOne의 끝

0x3000

FunctionSix의 시작

0x305F

FunctionSix의 끝

0x7FFF

메모리에서 모듈의 끝

디버거가 스택에서 주소를 찾으면 다음 아래쪽 주소가 있는 기호를 선택합니다. 공용 기호 테이블에는 각 기호의 주소가 포함되어 있지만 크기 정보는 없으므로 디버거는 주소가 실제로 특정 기호의 경계 내에 있는지 알 수 없습니다.

따라서 주소 0x2031 오류가 발생하는 경우 Microsoft OCA에서 실행하는 디버거는 오류를 FunctionOne 내에 있는 것으로 올바르게 식별합니다. 이 함수는 불활성 함수이므로 디버거는 스택을 계속 걸어 충돌의 원인을 찾습니다.

그러나 0x2052 오류가 발생하면 디버거는 이 함수의 실제 끝(0x203F)을 벗어나더라도 여전히 이 주소와 FunctionOne과 일치합니다.

따라서 노출하려는 함수뿐만 아니라 이러한 함수 바로 뒤의 기호도 제거된 기호 파일에 포함해야 합니다. 이 예제에서는 FunctionOne, FunctionTwo, FunctionSix 및FunctionSeven을 노출하려고 합니다.

주소 메모리 내용

0x1000

모듈의 기본 주소

0x2000

FunctionOne의 시작

0x203F

FunctionOne의 끝

0x2040

FunctionTwo의 시작

0x3000

FunctionSix의 시작

0x305F

FunctionSix의 끝

0x3060

FunctionSeven의 시작

0x7FFF

메모리에서 모듈의 끝

이러한 4개의 함수를 모두 제거된 기호 파일에 포함하는 경우 Microsoft OCA 분석은 주소 0x2052 FunctionOne의 일부로 잘못 처리하지 않습니다. 이 예제에서는 이 주소가 FunctionTwo의 일부라고 가정하지만 OCA에 FunctionTwo 를 비활성 함수로 등록하지 않았기 때문에 중요하지 않습니다. 중요한 점은 0x2052 주소가 불활성 함수 내에 속하지 않는 것으로 인식되므로 OCA는 이를 드라이버 내에서 의미 있는 오류로 인식하고 오류를 알려줄 수 있다는 것입니다.

각 불활성 함수 다음에 함수의 이름을 공개하지 않으려면 각 불활성 함수 다음에 중요하지 않은 함수를 코드에 삽입하여 이러한 함수의 이름을 공용 기호 파일에 포함할 수 있습니다. 일부 최적화 루틴이 이를 변경하거나 일부 함수를 완전히 제거할 수 있으므로 이러한 추가 함수가 이진의 주소 공간에서 실제로 불활성 함수를 따르는지 확인해야 합니다.