windbg - (ASP.NET 환경에서 유용한) netext 확장
기존에도 MEX 확장으로,
windbg - 닷넷 개발자를 위한 MEX Debugging Extension 소개
; https://www.sysnet.pe.kr/2/0/11644
sos.dll에 비해 꽤 유용한 명령어들을 제공하긴 했지만 netext는,
rodneyviana/netext
; https://github.com/rodneyviana/netext/tree/master/Binaries
ASP.ENT 환경에 좀 더 특화된 명령어들을 제공합니다. 가령, web.config에 대한 설정을 알고 싶을때 "wconfig" 명령어를 이용하면 다음과 같이 machine.config부터 시작해 계층적으로 값들을 모두 열거해 줍니다.
0:000> !wconfig
<--
Key: configProtectedData
Definition Config Path: machine
Filename: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config
Line: 0n143
-->
...[생략]..
<--
Key: system.web/fullTrustAssemblies
Definition Config Path: machine/webroot
Filename: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
Line: 0n24
-->
...[생략]..
<httpHandlers>
<add xamlRootElementType="System.ServiceModel.Activities.WorkflowService, System.ServiceModel.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" httpHandlerType="System.ServiceModel.Activities.Activation.ServiceModelActivitiesActivationHandlerAsync, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add xamlRootElementType="System.Activities.Activity, System.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" httpHandlerType="System.ServiceModel.Activities.Activation.ServiceModelActivitiesActivationHandlerAsync, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpHandlers>
<--
Key: system.web/machineKey
Definition Config Path: machine/webroot/2/myservice
Filename: D:\wwwroot\myservice\web.config
Line: 0n30
-->
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="B03F5F7F11D50A3A" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
</dependentAssembly>
...[생략]...
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.1.3.0" newVersion="3.1.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
...[생략]..
그 외에도 제가 기존에 pykd로 만들어둔 스크립트 명령어에 대해,
windbg/sos - Hashtable의 buckets 배열 내용을 모두 덤프하는 방법 (do_hashtable.py)
; https://www.sysnet.pe.kr/2/0/12084
windbg/sos - Dictionary의 entries 배열 내용을 모두 덤프하는 방법 (do_hashtable.py)
; https://www.sysnet.pe.kr/2/0/12087
개별 명령어로도 제공하고 있습니다.
!whash [...addr_of_hashtable_instance...]
!wdict [...addr_of_dictionary_instance...]
멋지죠? ^^
netext의 readme.txt를 보면,
netext/Binaries/readme.txt
; https://github.com/rodneyviana/netext/blob/master/Binaries/readme.txt
재미있는 명령어가 눈에 들어옵니다.
.cmdtree d:\wext\netext.tl
netext.tl은 텍스트 파일인데,
windbg ANSI Command Tree 1.0
title {"netext cheat sheet"}
body
{"General"}
{"Load"} {".load netext"}
{"Index"} {"!windex"}
{"Create Objects Tree"} {"!windex -tree"}
{"Stack Objects"} {"~*e!wstack"}
{"Enumerate types"} {"!windex -enumtypes"}
{"Dump Rooted Objects"} {"!wgchandles"}
{"Get Heap Info Only"} {"!wheap -detailsonly"}
...[생략]...
{"Security/WIF"}
{"Expired/Valid Tokens"} {"!wfrom -nospace -nofield -type System.ServiceModel.Security.Tokens.SecurityContextSecurityToken select $addr()," ", id," ",$tickstodatetime(keyExpirationTime.dateData)," ",$if(keyExpirationTime.dateData > $now(), "Valid", "Expired")"}
이를 cmdtree로 실행하면 windbg 화면에서 다음과 같은 별도의 창이 뜨고,
나열된 명령어를 마우스로 두번 클릭하는 것만으로 쉽게 실행하는 것이 가능합니다. 그러고 보면 windbg가 은근히 확장에 대한 배려를 곳곳에 심어놓은 것에 감탄하게 됩니다. ^^
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]