다음을 통해 공유


추가 DBH 예제

다음은 DBH 프롬프트에서 실행할 수 있는 명령의 추가 예입니다.

개인 기호 및 공용 기호 표시

대상이 전체 기호 파일인 경우 각 공용 기호가 파일에 두 번 나타납니다. 즉, 공용 기호 테이블과 프라이빗 기호 데이터에 표시됩니다. 공용 기호 테이블의 복사본에는 종종 다양한 장식(접두사 및 접미사)이 포함되어 있습니다. 자세한 내용은 공용 및 개인 기호를 참조 하세요.

DBH는 개인 기호 데이터, 장식이 없는 공용 기호 테이블 및 장식이 있는 공용 기호 테이블에서 이 기호에 대한 정보를 표시할 수 있습니다. 다음은 매번 명령 추가기 414fe0 을 사용하여 이 세 가지가 모두 표시되는 예제입니다.

이 예제에 이 명령이 처음 표시되면 DBH는 기본 기호 옵션을 사용하므로 결과 정보는 프라이빗 기호 데이터에서 가져옵니다. 이 정보에는 함수 fgets의 주소, 크기 및 데이터 형식이 포함됩니다. 그런 다음 명령 symopt +4000을 사용하여 SYMOPT_PUBLICS_ONLY 옵션을 켭니다. 이로 인해 DBH는 프라이빗 기호 데이터를 무시하므로 addr 414fe0 명령이 두 번째로 실행되면 DBH는 공용 기호 테이블을 사용하고 함수 fgets에 대한 크기 또는 데이터 형식 정보가 표시되지 않습니다. 마지막으로 명령 symopt -2가 사용되어 SYMOPT_UNDNAME 옵션을 해제하고 DBH에 장식이 포함됩니다. 이 마지막 시간에 추가기 414fe0이 실행되면 데코레이팅된 버전의 함수 이름 _fgets 표시됩니다.

pid:4308 mod:TimeTest[400000]: addr 414fe0

fgets
   name : fgets
   addr :   414fe0
   size : 113
  flags : 0
   type : 7e
modbase :   400000
  value :        0
    reg : 0
  scope : SymTagNull (0)
    tag : SymTagFunction (5)
  index : 7d

pid:4308 mod:TimeTest[400000]: symopt +4000

Symbol Options: 0x10c13
Symbol Options: 0x14c13

pid:4308 mod:TimeTest[400000]: addr 414fe0

fgets
   name : fgets
   addr :   414fe0
   size : 0
  flags : 0
   type : 0
modbase :   400000
  value :        0
    reg : 0
  scope : SymTagNull (0)
    tag : SymTagPublicSymbol (a)
  index : 7f

pid:4308 mod:TimeTest[400000]: symopt -2

Symbol Options: 0x14c13
Symbol Options: 0x14c11

pid:4308 mod:TimeTest[400000]: addr 414fe0

_fgets
   name : _fgets
   addr :   414fe0
   size : 0
  flags : 0
   type : 0
modbase :   400000
  value :        0
    reg : 0
  scope : SymTagNull (0)
    tag : SymTagPublicSymbol (a)
  index : 7f 

-d 명령줄 옵션을 사용한 경우 결과는 처음부터 데코레이팅된 공용 이름을 표시했을 것입니다.

특정 기호의 장식 확인

DBH는 특정 기호의 장식을 확인할 수 있습니다. 이 기능은 PDBCopy와 같은 장식으로 기호를 지정해야 하는 프로그램과 함께 사용할 때 유용할 수 있습니다.

예를 들어, 기호 파일 mysymbols.pdb에 비코딩된 이름이 MyFunction1인 기호가 포함되어 있다고 가정해 보겠습니다. 데코레이팅된 이름을 찾으려면 다음 절차를 사용합니다.

먼저 -d 명령줄 옵션 없이 DBH를 시작한 다음, 모든 정보가 공용 기호 테이블에서 제공되도록 symopt +4000 명령을 사용합니다.

C:\> dbh c:\mydir\mysymbols.pdb

mysymbols [1000000]: symopt +4000

Symbol Options: 0x10c13
Symbol Options: 0x14c13 

다음으로 이름 명령 또는 열거형 명령을 사용하여 원하는 기호의 주소를 표시합니다.

mysymbols [1000000]: enum myfunction1 

 index            address     name
   2ab            102cb4e :   MyFunction1

이제 symopt -2를 사용하여 기호 장식을 표시한 다음 이 기호의 주소와 함께 addr 명령을 사용합니다.

mysymbols [1000000]: symopt -2

Symbol Options: 0x14c13
Symbol Options: 0x14c11

mysymbols [1000000]: addr 102cb4e

_MyFunction1@4
   name : _InterlockedIncrement@4
   addr :  102cb4e
   size : 0
  flags : 0
   type : 0
modbase :  1000000
  value :        0
    reg : 0
  scope : SymTagNull (0)
    tag : SymTagPublicSymbol (a)
  index : 2ab  

이렇게 하면 기호 의 데코레이팅된 이름이 _MyFunction1@4.

기호 장식 디코딩

undec 명령을 사용하여 C++ 기호 장식의 의미를 표시할 수 있습니다. 다음 예제에서는 ?? _C@_03GGCAPAJC@Sep?$AA@은 문자열임을 나타내기 위해 디코딩됩니다.

dbh: undec ??_C@_03GGCAPAJC@Sep?$AA@

??_C@_03GGCAPAJC@Sep?$AA@ =
`string' 

다음 예제에서는 세 개의 함수 이름에 연결된 장식을 디코딩하여 프로토타입을 표시합니다.

dbh: undec ?gcontext@@3_KA

?gcontext@@3_KA =
unsigned __int64 gcontext


dbh: undec ?pathcpy@@YGXPAGPBG1K@Z

?pathcpy@@YGXPAGPBG1K@Z =
void __stdcall pathcpy(unsigned short *,unsigned short const *,unsigned short const *,unsigned long)


dbh: undec ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z

?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z =
int (__cdecl*__cdecl _set_new_handler(int (__cdecl*)(unsigned int)))(unsigned int) 

undec 명령은 함수 이름에 일반적으로 연결되는 초기 밑줄, 접두사 __imp_ 또는 후행 "@주소" 장식에 대한 정보를 표시하지 않습니다.

현재 로드된 모듈의 기호 이름뿐만 아니라 문자열과 함께 undec 명령을 사용할 수 있습니다.

주소별로 기호 목록 정렬

주소 순서로 정렬된 기호 목록을 원하는 경우 일괄 처리 모드에서 DBH를 실행하고 결과를 정렬 명령으로 파이프할 수 있습니다. 주소 값은 일반적으로 각 줄의 18번째 열에서 시작되므로 다음 명령은 결과를 주소별로 정렬합니다.

dbh -p:4672 enum mymodule!* | sort /+18

원본 줄 정보 표시

전체 기호 파일을 사용하는 경우 DBH는 원본 줄 정보를 표시할 수 있습니다. 이 정보는 기호 파일 자체에 저장되므로 원본 파일에 액세스할 필요가 없습니다.

여기서 줄 명령은 지정된 소스 줄에 해당하는 이진 명령의 16진수 주소를 표시하고 해당 줄과 연결된 기호를 표시합니다. (이 예제에서는 선과 연결된 기호가 없습니다.)

dbh [1000000]: line myprogram.cpp#767

   file : e:\mydirectory\src\myprogram.cpp
   line : 767
   addr :  1006191
    key : 0000000000000000
disp : 0

여기서 srclines 명령은 지정된 소스 줄과 연결된 개체 파일을 표시합니다.

dbh [1000000]: srclines myprogram.cpp 767

0x1006191: e:\mydirectory\objchk\amd64\myprogram.obj
line 767 e:\mydirectory\src\myprogram.cpp

srclines출력은 ln(가장 가까운 기호 나열) 디버거 명령의 출력과 유사합니다.

데이터 형식 표시

형식 명령을 사용하여 데이터 형식에 대한 정보를 표시할 수 있습니다. 여기서는 CMDPROC 형식에 대한 데이터를 표시합니다.

dbh [1000000]: type CMDPROC

   name : CMDPROC
   addr :        0
   size : 8
  flags : 0
   type : c
modbase :  1000000
  value :        0
    reg : 0
  scope : SymTagNull (0)
    tag : SymTagTypedef (11)
  index : c

"태그" 다음에 나열된 값은 이 데이터 형식의 특성을 지정합니다. 이 경우 SymTagTypedef는 이 형식이 typedef 문을 사용하여 정의되었음을 나타냅니다.

허수 기호 사용

add 명령은 로드된 모듈에 가상 기호를 추가할 수 있습니다. 실제 기호 파일은 변경되지 않습니다. DBH의 메모리에 있는 해당 파일의 이미지만 변경됩니다.

add 명령은 지정된 주소 범위와 연결된 기호를 일시적으로 재정의하려는 경우에 유용할 수 있습니다. 다음 예제에서는 MyModule!main연결된 주소 범위의 일부가 가상 기호 MyModule!magic에 의해 재정의됩니다.

가상 기호가 추가되기 전에 모듈이 표시되는 방법은 다음과 같습니다. 주 함수는 0x0042CC56 시작하며 크기는 0x42B. 따라서 addr 명령이 주소 0x0042CD10 함께 사용될 때 이 주소는 주 함수의 경계 내에 있는 것으로 인식합니다.

pid:6040 mod:MyModule[400000]: enum timetest!ma*

 index            address     name
     1             42cc56 :   main
     3             415810 :   malloc
     5             415450 :   mainCRTStartup

pid:6040 mod:MyModule[400000]: addr 42cc56

main
   name : main
   addr :   42cc56
   size : 42b
  flags : 0
   type : 2
modbase :   400000
  value :        0
    reg : 0
  scope : SymTagNull (0)
    tag : SymTagFunction (5)
  index : 1

pid:6040 mod:MyModule[400000]: addr 42cd10

main+ba
   name : main
   addr :   42cc56
   size : 42b
  flags : 0
   type : 2
modbase :   400000
  value :        0
    reg : 0
  scope : SymTagNull (0)
    tag : SymTagFunction (5)
  index : 1 

이제 기호 매직 이 크기가 0x10 바이트인 주소 0x0042CD00 추가됩니다. 열거형 명령을 사용하면 인덱스 내의 상위 비트가 설정되어 가상 기호임을 표시합니다.

pid:6040 mod:MyModule[400000]: add magic 42cd00 10


pid:6040 mod:MyModule[400000]: enum timetest!ma*

 index            address     name
     1             42cc56 :   main
     3             415810 :   malloc
     5             415450 :   mainCRTStartup
  80000001             42cd00 :   magic 

addr 명령을 사용하면 범위에 지정된 주소가 포함된 기호를 찾습니다. 이 검색은 지정된 주소로 시작하고 뒤로 실행되므로 이제 0x004CD10 주소가 매직연결됩니다. 반면에 0x004CD40 주소는 매직 기호의 범위 밖에 있기 때문에 여전히 main연결됩니다. 또한 SymTagCustom 태그는 가상 기호를 나타냅니다.

pid:6040 mod:MyModule[400000]: addr 42cd10

magic+10
   name : magic
   addr :   42cd00
   size : 10
  flags : 1000
   type : 0
modbase :   400000
  value :        0
    reg : 0
  scope : SymTagNull (0)
    tag : SymTagCustom (1a)
  index : 80000001

pid:6040 mod:MyModule[400000]: addr 42cd40

main+ea
   name : main
   addr :   42cc56
   size : 42b
  flags : 0
   type : 2
modbase :   400000
  value :        0
    reg : 0
  scope : SymTagNull (0)
    tag : SymTagFunction (5)
  index : 1 

마지막으로 del 명령은 기호 매직삭제하여 모든 기호를 원래 범위로 반환할 수 있습니다.

pid:6040 mod:MyModule[400000]: del magic


pid:6040 mod:MyModule[400000]: enum timetest!ma*

 index            address     name
     1             42cc56 :   main
     3             415810 :   malloc
     5             415450 :   mainCRTStartup