추가 DBH 예제

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

프라이빗 기호 및 공용 기호 표시

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

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

이 예제에 이 명령이 처음 표시되면 DBH는 기본 기호 옵션을 사용하므로 결과 정보는 프라이빗 기호 데이터에서 가져옵니다. 이 정보에는 함수 fgets의 주소, 크기 및 데이터 형식이 포함됩니다. 그런 다음 symopt +4000 명령을 사용하여 SYMOPT_PUBLICS_ONLY 옵션을 설정합니다. 이로 인해 DBH는 프라이빗 기호 데이터를 무시하므로 addr 414fe0 명령을 두 번째로 실행할 때 DBH는 공용 기호 테이블을 사용하고 함수 fgets에 대한 크기 또는 데이터 형식 정보가 표시되지 않습니다. 마지막으로 명령 symopt -2가 사용되어 SYMOPT_UNDNAME 옵션을 끄고 DBH에 장식이 포함됩니다. addr 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!기본 연결된 주소 범위의 일부가 가상 기호 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 주소는 매직 기호의 범위 밖에 있기 때문에 여전히 기본 연결됩니다. 또한 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